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

ops/2024/11/1 18:00:25/

很多开发语言都能找到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>之间直接输出内容。

<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可以通过自己的一些方法传进来:

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打开,就是下面这样。


http://www.ppmy.cn/ops/130193.html

相关文章

Canvas字体高度计算与PDF高度如何统一

因为英文书写时并不是像汉字一样就是一个方块字&#xff0c;比如下图p有部分是在基线以下&#xff0c;其他的字体都是以基线为参照书写&#xff0c;所以在Canvas中字(或字母)所占的高度是&#xff1a; metrics.boundingBoxAscent metrics.boundingBoxDescent上行间距下行间距…

vue 禁用element-ui calendar 取消非本月日期的点击事件

需求描述&#xff1a;原本的日历组件不是本月的日期是灰色的&#xff0c;且点击后会跳转到对应的月份&#xff0c;现在不想它跳转&#xff0c;需要禁用它的点击事件 方法&#xff1a;使用css的pointer-events:none属性即可&#xff0c;把不是当前月份的日历表格的td属性修改 :…

【STM32】SD卡

(一)常用卡的认识 在学习这个内容之前&#xff0c;作为生活小白的我对于SD卡、TF卡、SIM卡毫无了解&#xff0c;晕头转向。 SD卡&#xff1a;Secure Digital Card的英文缩写&#xff0c;直译就是“安全数字卡”。一般用于大一些的电子设备比如&#xff1a;电脑、数码相机、AV…

python debug作业

任务类型任务内容预计耗时闯关任务Leetcode 383(笔记中提交代码与leetcode提交通过截图)20mins闯关任务Vscode连接InternStudio debug笔记10mins可选任务pip安装到指定目录10mins leetcode题目解析&#xff1a; 解题思路 字符统计&#xff1a;使用 Python 的 Counter 类统计 ra…

三代CAN技术演进:从CAN CC到CAN XL的创新路径(下篇)

欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #CAN #工业通信 #CAN XL 导读 CAN&#xff08;Controller Area Network&#xff09;是一种用于实时应用的串行通信协议&#xff0c;广泛应用于汽车和工业电子设备中&#xff0c;以实现不同设备间的高效数据交换。它采…

程序员如何平衡日常编码工作与提升式学习

程序员如何平衡日常编码工作与提升式学习 在快速变化的技术世界中&#xff0c;作为程序员的你可能常常感到疲惫不堪&#xff0c;尤其是在日常的编码工作与个人成长之间寻找平衡时。如何在应对紧迫的项目截止日期同时&#xff0c;又能不断提升自己的技能&#xff1f;本文将探讨…

【网络面积篇】TCP断开连接(笔记)

目录 一. 四次挥手 &#xff08;1&#xff09;过程描述 &#xff08;2&#xff09;为什么是四次挥手&#xff1f; 二、相关问题 1. 第一次挥手丢失了&#xff0c;会发生什么&#xff1f; 2. 第二次挥手丢失了&#xff0c;会发生什么&#xff1f; 补充&#xff1a;close …

【C++】类和对象(十):static成员

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的static成员&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1 概念2 特性 1 概念 声明为static的类成员称为类的静态成员&#xff0c;用static修饰…