微軟的Excel格式有兩種:.xls和.xlsx,Excel2003及之前的版本是.xls格式,從Excel2007開始支持.xlsx格式,只使用基本功能的話兩種格式看起來并沒有多大差別,但是兩者檔案格式確實截然不同的,
excel97-2003(xls格式)
XLS檔案最為一個檔案流(FileStream),是由多個子流(SubStream)構成的,下面這張圖是將各個SubStream按順序依次展現出來,這些SubStream都是有若干個整數倍Block(1 block = 512 bytes)組成,
| SubStream | |
| XLS Header | 占1個block(512bytes)固定大小 |
| WorkBook | 最小占8個block(4096bytes) |
| Summary Information | 占8個block(4096bytes)固定大小 |
| Document Summary Information | 占8個block(4096bytes)固定大小 |
| XLS Header擴展區 | 只有.xls檔案超過一定大小時,才會出現 |
| BigBolck pointer | 最小占1個(512bytes) |
| RootEntry | 占1個block(512bytes) |
其中所有單元格資料記錄在WorkBook子流中,以下為WorkBook區的重要內容結構,
0x0809 WorkbookHeader,即BOF,長度范圍1~20
| offset | size | content |
| 0 | 2 | 存放XLS檔案的版本型別 BIFF8/BIFF8X 0x0600 BIFF7 0x0500 |
| 2 | 2 | WorkBookGlobals,0x0005 |
0x0031 FONT,長度24bytes,0x041EFORMAT
0x00E0 XF ExtendFORMAT
0x0293 STYLE
0x0085 BOUNDSHEET,即Sheet指標區,N個Sheet則有N個0x0085,包含每個Sheet的名稱、sheet資料內容在xls檔案中的偏移量,
| offset | size | content |
| 0 | 2 | 資料段長度(Sheet指標區和名稱區長度) |
| 2 | 4 | 該Sheet的BOF的絕對位移量,相對于Workbook |
| 6 | Sheet名稱區,長度為資料段長度-2 |
0x008C Country,語言和地區設定,
0x00FC SST內容(SharingStringTable用來存放字串,目的是為了讓各個sheet都能夠共享該SST中字串內容)(Excel表資料,所有Sheet資料均放于此)
| offset | size | content |
| 0 | 4 | 資料中所有字串的數量 |
| 4 | 4 | 將要放在SST中字串的數量 |
| 以下開始針對每個字串進行回圈處理 | ||
| 8 | 2 | 該字串的長度,若為雙位元組字符也算做一個 |
| 10 | 1 | 字串中若包含雙位元組字符(如中文),則為0x01,若為純ASCII字符,則為0x00 |
| 11 | n | 存放字串資訊 |
0x00FF ExtendedSST內容 在讀取XLS檔案時顯得不重要,但當創建XLS檔案時卻非常重要
| offset | size | content |
| 0 | 2 | 每一區塊字串的個數,其值>=8 |
| 以下開始針對每一區塊字串進行回圈處理 | ||
| 2 | 4 | 每一區塊第一個字符的絕對位置 |
| 6 | 2 | 每一區塊第一個字符的相對位置 |
| 8 | 2 | 保留 |
0x0809 Sheet1內容
0x0809 Header,20bytes
0x020BIndex,16+4*N個位元組
(注:注意標志后有兩位Size位,要從Size位計起)
| offset | size | content |
| 0 | 4 | 保留 |
| 4 | 4 | 第一行的序號 |
| 8 | 4 | 最后一行的序號(OpenOffice上介紹是sheet結尾的第一個未使用行的序號,行數的基數按0開始) |
| 10 | 4 | 指向DEFCOLWIDTH(0x0055)相對于Workbook Header的位置 |
| 14 | 4*N | 指向DBCELL(0x00D7)相對于WorkbookHeader的位置,當存在多個DBCELL時,需要設定多個,N為該sheet的行數/32 |
0x0055 DEFCOLWIDTH,6bytes
0x0200 Dimensions,18byte,存放sheet1的行數和列數,
| offset | size | content |
| 0 | 2 | 段大小(下列資料段大小) |
| 2 | 4 | 第一行的序號 |
| 6 | 4 | 最后一行的序號 |
| 10 | 2 | 第一列的序號 |
| 12 | 2 | 最后一列的序號 |
| 12 | 2 | 保留 |
RowBlock
0x0208 Row,20bytes,Sheet中有多少行就有對應多少個0x0208開頭的行資訊,如果sheet中有5行,那么RowBlock的大小就是20*5bytes
| offset | size | content |
| 0 | 2 | 行的序號 |
| 2 | 2 | 列的序號 |
CellBlock
設定sheet中每一個單元格的資訊,順序為針對每一行的每一列依次設定,如00,01,02……10,11,12……20,21,22……
0x00FD LABELSST,14bytes,針對字串值已經在SST中保存,這里只保存其對應的序號,記錄文字串(在共享資料表裡)的Cell,格式為:
2byte:第幾行(由0編起)
2byte:第幾列(由0編起)
2byte:XFrecord索引值
4byte:共享字串表的索引值
0x027E RK2,14bytes,針對RK值(指編過碼的整型或浮點型值)
0x00BD MULRK,28bytes記錄數字(多個連續列)的Cell,格式為:
2byte:第幾行(由0編起)
2byte:起始列(由0編起)
?byte:RKCell資訊(每個6byte)
2byte:XFrecord索引值
4byte:RK數值(后述)
2byte:結束列(由0編起)
0x00D7 DBCELL,隨著行數的變化而發生變化
| offset | size | content |
| 0 | 4 | DBCELL的偏移量減去RowBlock中第一個Row的偏移量 |
| 4 | 2 | CellBlock中首行的第一個Cell的偏移量減去RowBlock中第二個Row的偏移量 |
| 以下為回圈處理部分,1<n<=Max_Row | ||
| 6 | 2 | CellBlock中第n行的第一個Cell的偏移量減去第n-1行的第一個Cell的偏移量 |
當XLS中的行數大于32時,系統將回圈處理,對于每個32行內容單獨生成RowBlock、CellBlock和DBCELL,
0x0809 Sheet2內容
0x0809 Sheet3內容(如果有Sheet2、Sheet3)
0x000A EOF,Workbook結束標示符
==========這是吐槽線===========
這格式確實已經落后了,實在是太復雜,,,如果可以,我不再想碰這,
excel2007(xlsx格式)
xlsx格式相比舊的xls格式的資料結構要簡單的多,其使用xml格式進行存盤,
如下的表格:
| A | B | C | |
| 1 | 姓名 | 性別 | 年齡 |
| 2 | 張三 | 男 | 30 |
| 3 | 小明 | 男 | 16 |
| 4 | 小紅 | 女 | 20 |
然后將xlsx檔案后綴改為zip,用壓縮軟體打開,其內容存盤在sheet1.xml檔案里:
<sheetData>
<row r="1" spans="1:3" x14ac:dyDescent="0.2">
<c r="A1" t="s">
<v>0</v>
</c>
<c r="B1" t="s">
<v>2</v>
</c>
<c r="C1" t="s">
<v>1</v>
</c>
</row>
<row r="2" spans="1:3" x14ac:dyDescent="0.2">
<c r="A2" t="s">
<v>3</v>
</c>
<c r="B2" t="s">
<v>6</v>
</c>
<c r="C2">
<v>30</v>
</c>
</row>
<row r="3" spans="1:3" x14ac:dyDescent="0.2">
<c r="A3" t="s">
<v>4</v>
</c>
<c r="B3" t="s">
<v>6</v>
</c>
<c r="C3">
<v>16</v>
</c>
</row>
<row r="4" spans="1:3" x14ac:dyDescent="0.2">
<c r="A4" t="s">
<v>5</v>
</c>
<c r="B4" t="s">
<v>7</v>
</c>
<c r="C4">
<v>20</v>
</c>
</row>
</sheetData>
<c></c>標簽就代表每個單元格,t="s"表示值為字串,對應的字串值可以在sharedStrings.xml里找到:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="9" uniqueCount="8">
<si>
<t>姓名</t>
</si>
<si>
<t>年齡</t>
</si>
<si>
<t>性別</t>
</si>
<si>
<t>張三</t>
</si>
<si>
<t>小明</t>
</si>
<si>
<t>小紅</t>
</si>
<si>
<t>男</t>
</si>
<si>
<t>女</t>
</si>
</sst>
從兩個xml內容對比可知,第二個xml是Excel的內容去重后的內容集合,第一個專案xml通過集合的index來關聯第二個xml的內容
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/257164.html
標籤:區塊鏈
上一篇:卡槽競拍,對未來生態有何影響
