電子商務(wù)網(wǎng)站建設(shè)方案案例做一個(gè)網(wǎng)站的步驟
很多開(kāi)發(fā)語(yǔ)言都能找到excel文檔讀寫(xiě)的庫(kù),但是在資源極其受限的環(huán)境下開(kāi)發(fā),引入這些庫(kù)會(huì)帶來(lái)兼容性問(wèn)題。因?yàn)橐粋€(gè)小功能引入一堆庫(kù),我始終覺(jué)得劃不來(lái)??吹接许?xiàng)目引用的jar包有一百多個(gè),看著頭麻,根本搞不清誰(shuí)依賴(lài)誰(shuí)。你會(huì)說(shuō)用maven、gradle來(lái)解決,但是我極不喜歡,比如在java與安卓都要支持的情況,就要碰到麻煩了。
通過(guò)分析excel文檔格式,自己用模板生成,就不會(huì)碰到這類(lèi)問(wèn)題。xlsx格式是開(kāi)放的,xml形式的,應(yīng)該也會(huì)穩(wěn)定很長(zhǎng)時(shí)間。下面介紹一下分析的結(jié)果,實(shí)現(xiàn)方法類(lèi)似于我前面寫(xiě)的關(guān)于docx文件的輸出操作。java中可以使用freemarker、js等動(dòng)態(tài)的方法替換模板,其他語(yǔ)言應(yīng)該有類(lèi)似的工具。java中用到的工具只有zip(開(kāi)發(fā)語(yǔ)言自帶),js(jdk11自帶或用quickjs)或freemarker,連接如下:
java中,怎樣用最簡(jiǎn)單方法實(shí)現(xiàn)寫(xiě)word文檔_java 寫(xiě)word-CSDN博客
xls文檔格式介紹,看這篇文檔OOXML:詳解Excel工作表(worksheet) - 知乎 (zhihu.com)
xlsx文檔本質(zhì)也是一個(gè)zip文件,將擴(kuò)展名改成zip,然后解壓,目錄如下,主要內(nèi)容都在xl子目錄中:
worksheets目錄下有各個(gè)sheet的數(shù)據(jù),比如sheet1.xml。只要將數(shù)據(jù)逐行格式化輸出到sheet1.xml就行了,輸出完成后,再將內(nèi)容打包成zip,然后將文件擴(kuò)展名改成xlsx就可以了。
在輸出到sheet1.xml時(shí),注意單元的類(lèi)型不要設(shè)置,一旦設(shè)置了t="s",<v></v>中的內(nèi)容就是一個(gè)索引值(比如0,1,2,3,5...N),表示字符串是sharedStrings.xml中的第N個(gè)字符串。sharedStrings.xml中記錄了所有共享的字符串,從前往后,編號(hào)分別為0、1、2...。使用sharedStrings.xml能節(jié)省一點(diǎn)空間,但是對(duì)于freemarker之類(lèi)的格式庫(kù)就麻煩了,所以單元格不建議設(shè)置t="s",而是在<v></v>之間直接輸出內(nèi)容。
<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>
提供一個(gè)用js輸出的sheet1.xml文件,其中的list可以通過(guò)自己的一些方法傳進(jìn)來(lái):
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打開(kāi),就是下面這樣。