使用方法
一张销售单由三段拼成:抬头(谁卖给谁、哪一号单据、哪一天)、明细(卖了什么、多少、什么价钱)与结算(不含税小计、按税率算出的税额、价税合计)。本页把这三段拆成独立控件,改任一个数字,其余两处立刻跟着重算。
- 先填抬头四项:销售方名称(示例「晨光文具经营部」)、客户名称(示例「远山科技有限公司」)、单据编号(示例 XS-20261021-007)、单据日期(示例 2026-10-21)。四项任一为空都会给出指明字段的红色提示,不会静默生成一张缺抬头的单据。
- 「税率」填百分比数值而不是小数:示例填 6 表示 6%,允许 0~100、可带两位小数。免税或不需要税额的场景填 0,此时税额恒为 0.00,合计等于小计。
- 商品行最多 6 行,每行四格:品名(≤30 字)、数量(0.01~99999)、单位(≤6 字,如「本」「支」「个」)、单价(0~9999999)。品名为空的行整行跳过,所以 1 行到 6 行都用同一份表单:默认示例填了前 3 行,第 4 到第 6 行的品名留空即自动忽略。
- 点「生成账单」或在任一输入框里按回车,统计条、纯文本单据与下方明细表同步刷新;「载入默认示例」把六项抬头与三行商品一次性还原。
- 「复制账单文本」把整张单据原样带格式复制走,可直接粘进邮件正文、聊天窗口或打印前的文件;「导出明细 CSV」导出的文件开头带 BOM,Excel 双击打开中文不乱码;「复制明细 TSV」则适合直接粘贴到表格软件里。
账单销售单生成器能解决什么
手写账单最容易翻车的不是数量,而是逐行金额的口算。三行商品心算还行,六行商品配两位小数的单价时,口算的出错率高得惊人,而且错误往往在收款之后才被发现——对方按自己算的金额付款,差额只能靠反复翻聊天记录找源头。本页把「数量 × 单价」这一步交给机器,每行金额都在明细表里单独占一行,任何一行对不上都能立刻定位,不用重算整张单。
第二类混乱来自含税与不含税混着写。同一句「合计 71.02」,有人指的是不含税小计加税之后的价税合计,有人把 67.00 的货款本身就称为合计。本页强制区分三个名字:小计(不含税货款)、税额(小计 × 税率)、合计(小计 + 税额),并在统计条里同时列出。三者写在一行、标明口径,收付款双方不用再猜。
第三类问题是单据的可读性。多数手写或小作坊出的销售单,品名长短不齐、金额左对齐,扫一眼根本看不出哪几个数字需要核对。本页按「显示宽度」排版:一个汉字算两列、一个 ASCII 字符算一列,金额与单价统一右对齐,个位到十位对齐在同一条竖线上,错行、少位数这类问题肉眼一眼可见。
本页不做的事同样说清楚:不做发票开具与税控开票(发票与金税盘的号码、校验规则由税务机关规定,本页也不接触发票号池);不做含税单价反推(本页采用价外税口径,单价一律按不含税录入);不保存任何单据内容——所有数据只留在当前页面,刷新即丢失,需要留底请导出 CSV 或复制文本。
原理与计算口径
三条算式写死在页面里:每行金额 = 数量 × 单价;税额 = 小计 × 税率 ÷ 100;合计 = 小计 + 税额。默认示例第一行 2 × 12.50 = 25.00,第二行 10 × 1.80 = 18.00,第三行 4 × 6.00 = 24.00,小计 = 25.00 + 18.00 + 24.00 = 67.00,税额 = 67.00 × 6 ÷ 100 = 4.02,合计 = 67.00 + 4.02 = 71.02。
先化成分再做加减。页面内部不直接用小数相加,而是把每个金额换算成整数「分」再累加:单价 12.50 → 1250 分,数量 2 → 每行 2500 分。这样做的好处是避免浮点尾差——十进制里的 0.1 在二进制里是无限循环小数,直接累加多行单价时会出现 0.30000000000000004 这类尾巴,化成整数分之后这类尾差被彻底消掉。
税额的舍入点。税额只对最终结果舍入一次:先算 小计(分)× 税率 ÷ 100,再对这个结果四舍五入到分。默认示例是 6700 × 6 ÷ 100 = 402 分,正好整除,两种算法结果一致;如果小计 67.00、税率 3.33%,则 6700 × 3.33 ÷ 100 = 223.11 分,四舍五入得 223 分即 2.23 元。注意不要在每行先算税再相加——逐行舍入会累积出最多半分每行的误差。
税率是百分比数而非比例。填 6 表示百分的六,页面内部除以 100;填 0.5 表示千分之五。填 100 时税额等于小计、合计恰好是小计的两倍,这是允许的上限行为,不代表任何真实税种。
对齐用的是显示宽度而不是字符数。中文排版里一个汉字的宽度约为两个西文字符,所以右对齐时按「汉字记 2 列、其余记 1 列」计算需要补的空格数。超出列宽的品名会被截断并加省略号,宁可截断也不让整行错位——因为账单的价值就在于每一个数字都在同一条竖线上。
完整示例
默认示例是一张三行商品的办公用品送货单:销售方「晨光文具经营部」、客户「远山科技有限公司」、单号 XS-20261021-007、日期 2026-10-21,税率 6%,备注「货到当面点清数量,签收后概不退换」。三行分别是:笔记本 2 本 × 12.50 = 25.00;签字笔 10 支 × 1.80 = 18.00;文件夹 4 个 × 6.00 = 24.00。
结算段为:不含税小计 67.00,税额 4.02,价税合计 71.02。若把税率改为 0,三个数变成 67.00、0.00、67.00;若在第 4 行补上「订书机 3 个 × 15.00」,则该行金额 45.00,小计变为 112.00,税额 112.00 × 6 ÷ 100 = 6.72,合计 118.72——改一个格子,统计条、单据文本、明细表三处同时变。
再看一个边界:把第 2 行单价改成 1.85,则金额 18.50,小计 67.50,税额 67.50 × 6 ÷ 100 = 4.05,合计 71.55。这里 6750 × 6 ÷ 100 = 405 分,仍是整数;把数量改成 3 支、单价 1.85 则金额 5.55,全单小计 54.55,税额 327.3 分 → 327 分即 3.27 元,这一步就是上面说的「最后一次性舍入」。
输入范围与对照表
下表列出全部字段的允许区间、默认值与越界时的提示口径,共 8 行:
| 字段 | 允许范围 | 默认 | 越界时的提示 |
|---|---|---|---|
| 销售方名称 | 1~40 字 | 晨光文具经营部 | 为空时提示「销售方名称为空」并停算 |
| 客户名称 | 1~40 字 | 远山科技有限公司 | 为空时提示「客户名称为空」并停算 |
| 单据编号 | 1~32 字 | XS-20261021-007 | 为空时提示「单据编号为空」 |
| 单据日期 | YYYY-MM-DD 且真实存在 | 2026-10-21 | 格式错或 2 月 30 日这类日期给出具体原因 |
| 税率 | 0~100(两位小数) | 6 | 非数字或越界时指明允许 0~100 |
| 品名 | ≤30 字,空则整行跳过 | 笔记本 / 签字笔 / 文件夹 | 六行全空时提示至少要填一行 |
| 数量 | 0.01~99999 | 2 / 10 / 4 | 为 0、负数或超上限时指明所在行 |
| 单价 | 0~9999999 | 12.50 / 1.80 / 6.00 | 负数或超上限时指明所在行 |
备注最多 60 字、单位最多 6 字且都可以留空;备注为空时单据里不出现「备注:」这一行,而不是留一个空壳冒号。
结果边界与舍入
两位小数的来历。所有金额以「分」为最小单位输出,即两位小数、不足补零:18.00 不会被写成 18,67.00 也不会写成 67。这是为了让同一列的小数点对齐,同时也提醒读者这两个零是精确的零、不是被省略的有效数字。
输入三位小数怎么办。数量与单价都先四舍五入到两位小数再参与运算:单价 1.855 按 1.86 计,因为本页的最小计量单位是分。若你的行业单价本身保留到厘(三位小数),请不要用本页直接结算,或先把单价手工四舍五入到分。
校验失败时结果区显示破折号。任何一项输入不合法时,统计条与单据文本都换成「—」,错误区给出指明字段名与允许范围的中文提示,而不是拿旧结果冒充新结果;修好之后点一次「生成账单」即恢复。这一点很重要:账单是要拿去收钱的,屏幕上明明还留着上一次的合计却已经改了数字,最容易酿成纠纷。
纯文本单据的适用边界。对齐依赖等宽字体与「汉字两倍宽」的渲染假设,粘贴到默认使用比例字体的聊天窗口时列可能错位,建议放进代码块或先粘进记事本;单据本身不具备法律效力,涉及正式结算请按当地法规开具发票或签署合同。页面不上传、不落库存任何输入,关掉标签页即全部消失。
常见问题
税率填 6 和填 0.06 有什么区别?
本页的税率单位是百分比,填 6 表示 6%,内部再除以 100。填 0.06 会被当成 0.06%,税额只有 0.04 元——这是最常见的填错,看到税额明显偏小时先检查这里。
为什么第 4 行填了数量和单价却没有出现在账单里?
因为该行品名为空。本页以品名是否为空判定这一行是否有效:品名为空则整行跳过,避免你在第 5 行留下一个孤零零的数量而被算进去。要用第 4 行,把品名补齐即可。
单价要填含税价怎么办?
本页采用价外税口径,单价一律按不含税录入,税额算在小计之上。若手里只有含税单价 106.00 元、税率 6%,先换算不含税单价 = 106.00 ÷ 1.06 = 100.00 元,再填 100.00,得到的合计就是 106.00。
合计对不上我手算的结果,先查哪里?
按三处排查:一是明细表每行金额是否等于数量乘单价;二是税率是否按百分比填;三是是否把含税总价当成了不含税小计。明细表逐行列出中间量,通常第一步就能定位。
数量可以填小数吗?
可以。最大 99999,允许两位小数,适合按重量、按米计价的商品。超过两位小数的部分四舍五入到两位;数量为 0 或负数会被拒绝,并提示「第 N 行数量」的允许区间。
导出的 CSV 用 Excel 打开是乱码?
导出文件开头已写入 UTF-8 的 BOM,正常情况下 Excel 双击直接识别中文。若用其他工具转存后乱码,多半是转存过程丢掉了 BOM,重新以「UTF-8 with BOM」保存即可。
能一次填超过 6 行商品吗?
不能,表单最多 6 行。更长的清单建议拆成两张单,或用下方「清单生成」把条目先整理清楚再开票;本页刻意限制行数,是为了保证单据在一屏内可读。
输入的内容会被保存或上传吗?
不会。全部计算在浏览器本地完成,页面没有提交与云端写入逻辑,刷新或关闭标签页后输入即消失。需要留底请用「导出明细 CSV」或「复制账单文本」。