程序中怎样用最简单方法实现写excel文档

很多开发语言都能找到excel文档读写的库,但是在资源极其受限的环境下开发,引入这些库会带来兼容性问题。因为一个小功能引入一堆库,我始终觉得划不来。看到有项目引用的jar包有一百多个,看着头麻,根本搞不清谁依赖谁。你会说用maven、gradle来解决,但是我极不喜欢,比如在java与安卓都要支持的情况,就要碰到麻烦了。

通过分析excel文档格式,自己用模板生成,就不会碰到这类问题。xlsx格式是开放的,xml形式的,应该也会稳定很长时间。下面介绍一下分析的结果,实现方法类似于我前面写的关于docx文件的输出操作。java中可以使用freemarker、js等动态的方法替换模板,其他语言应该有类似的工具。java中用到的工具只有zip(开发语言自带),js(jdk11自带或用quickjs)或freemarker,连接如下:

java中,怎样用最简单方法实现写word文档_java 写word-CSDN博客

xls文档格式介绍,看这篇文档OOXML:详解Excel工作表(worksheet) - 知乎 (zhihu.com)

xlsx文档本质也是一个zip文件,将扩展名改成zip,然后解压,目录如下,主要内容都在xl子目录中:

worksheets目录下有各个sheet的数据,比如sheet1.xml。只要将数据逐行格式化输出到sheet1.xml就行了,输出完成后,再将内容打包成zip,然后将文件扩展名改成xlsx就可以了。

在输出到sheet1.xml时,注意单元的类型不要设置,一旦设置了t="s",<v></v>中的内容就是一个索引值(比如0,1,2,3,5...N),表示字符串是sharedStrings.xml中的第N个字符串。sharedStrings.xml中记录了所有共享的字符串,从前往后,编号分别为0、1、2...。使用sharedStrings.xml能节省一点空间,但是对于freemarker之类的格式库就麻烦了,所以单元格不建议设置t="s",而是在<v></v>之间直接输出内容。

XML 复制代码
<row r="4" ht="15.75" customHeight="1" spans="1:7">
<c r="A1" s="7"><v>1</v></c>
<c r="B1" s="9" (t="s"不可以有)><v>7</v></c>
</row>

提供一个用js输出的sheet1.xml文件,其中的list可以通过自己的一些方法传进来:

javascript 复制代码
var list=[{a:1,b:'1b',c:'test1'},{a:2,b:'2b',c:'test2'}];
var txt=[`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:etc="http://www.wps.cn/officeDocument/2017/etCustomData"><sheetPr/><dimension ref="A1:C2"/><sheetViews><sheetView tabSelected="1" workbookViewId="0"><selection activeCell="C2" sqref="C2"/></sheetView></sheetViews><sheetFormatPr defaultColWidth="9" defaultRowHeight="14.4" outlineLevelRow="1" outlineLevelCol="2"/>
<sheetData>
<row r="1" spans="1:3"><c r="A1" t="s"><v>0</v></c><c r="B1" t="s"><v>1</v></c><c r="C1" t="s"><v>2</v></c></row>`];
var i=2;
for(var l of list) {
    txt.push(`<row r="`,i,`" spans="1:3"><c r="A"`,i,`><v>`,l.a,`</v></c><c r="B`,i,`"><v>`,l.b,`</v></c><c r="C`,i,`"><v>`,l.c,`</v></c></row>`);
	i++;
}
txt.push(`</sheetData><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
<pageSetup paperSize="9" orientation="portrait"/><headerFooter/></worksheet>`);
txt.join('');

zip打包后,再用excel打开,就是下面这样。

相关推荐
慧都小妮子9 小时前
标签打印如何减少手工抄数?用Bartender 直连 Excel 批量打印
excel·bartender·条码打印·标签打印软件·数据驱动打印·工业打印机
SunnyDays101117 小时前
Java 设置 Excel 数据验证:整数、日期、文本长度、下拉列表和时间
java·excel·数据验证·下拉列表
Metaphor69218 小时前
使用 Python 设置 Excel 行列自适应 【代码示例】
python·excel
用户0332126663671 天前
使用 Python 设置 Excel 行列自适应 【代码示例】
python·excel
企业数字化笔记1 天前
固定资产Excel批量导入怎么防重复?资产编码、重复检查和错误回执
java·后端·excel
CORNERSTONE3652 天前
低代码开发有哪些应用场景?
低代码·excel·erp·mes·企业数字化
小葱炖豆腐2 天前
python绘制excel折线图
python·excel·numpy·pandas·matplotlib
cspttty3 天前
2026年财务分析岗JD中的Excel、SQL、BI与业务分析要求
大数据·sql·excel
cspttty3 天前
HR数字化校招准备路线:Excel、SQL、BI和AI工具怎么学
人工智能·sql·excel
鲲穹AI种草4 天前
Excel 表格批量处理与数据整理,多款表格工具能力客观记录
excel·表格处理