Định dạng XML cho excel

Hi các bạn, cảm ơn đã quan tâm đến bài viết của mình. Các tut mình viết sẽ follow vào 1 chủ đề nhất định các góc nhỏ của vấn đề mà mình gặp phải trong quá trình làm việc và hướng mà mình giải quyết vấn đề. Mong là sẽ nhận được sự phản hồi về các hướng giải quyết của bạn khi gặp vấn đề tương tự. Nếu có bất kì thắc mắc j, xin hãy inbox cho mình.

Vấn đề

Mình có nhận 1 task về việc export excel sử dụng ruby on rails

Giải pháp

Có rất nhiều nhiều gem (library trong ruby on rails) có sẵn hỗ trợ export excel nhưng sử dụng mỗi loại gem thì đều phải học lại cú pháp của nó, và mục đích cuối cùng vẫn chỉ là export ra 1 file xml có định dạng dùng cho xlsx hiểu. Đằng nào cũng mất công học, chi bằng mình học từ cái ngọn, học cấu trúc file xml, như thế có thể dùng cho mọi loại ngôn ngữ.

Cấu trúc đơn giản của 1 excel xml

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:o="urn:schemas-microsoft-com:office:office"
  xmlns:x="urn:schemas-microsoft-com:office:excel"
  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:html="http://www.w3.org/TR/REC-html40">
  <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"></DocumentProperties>
  <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"></ExcelWorkbook>
  <Styles>
    <Style></Style>
  </Styles>
  <Worksheet>
    <Table>
      <Column/>
      <Row>
        <Cell>
          <Data></Data>
        </Cell>
      </Row>
    </Table>
    <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"></WorksheetOptions>
 </Worksheet>
</Workbook>

Ý nghĩa

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>

Khai báo này chỉ ra phiên bản mà xml đang sử dụng, nói chung nó là mặc định nên cũng không cần quan tâm đến nó lắm. Phần tiếp theo sau đây mới là phần cần quan tâm hơn cả.

<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:o="urn:schemas-microsoft-com:office:office"
  xmlns:x="urn:schemas-microsoft-com:office:excel"
  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"></Workbook>

Nội dung trong cặp thẻ này là bắt đầu khai báo văn bản office của mình. các attribute bên trong theo mình hiểu thì nó giúp văn bản sử dụng cú pháp rút gọn, chẳng hạn như dùng thẻ <Table> thay vì ss:Table trong spreadsheet, <x:Table> trong excel, việc này sẽ giúp cho định dạng trở thành chung cho hệ thống office.

<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
    <Author>Tuanna</Author>
    <LastAuthor>Tuan Nguyen Anh</LastAuthor>
    <Created>2016-04-14T01:59:23Z</Created>
    <Title>Excel</Title>
    <Subject>Excel</Subject>
    <Keywords>Excel</Keywords>
    <Category>Excel</Category>
    <Manager>Excel Tuan</Manager>
    <Version>14.00</Version>
 </DocumentProperties>

Thẻ DocumentProperties khai báo các thông tin về tệp tài liệu. Các properties params các thuộc tính mình để sẵn lên đoạn quote để các bạn nhìn rồi.

<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
    <WindowHeight>6795</WindowHeight>
    <WindowWidth>8460</WindowWidth>
    <WindowTopX>120</WindowTopX>
    <WindowTopY>15</WindowTopY>
    <ProtectStructure>False</ProtectStructure>
    <ProtectWindows>False</ProtectWindows>
 </ExcelWorkbook>

Tương tự như vậy, đoạn script này lo viêc phân cấu hình khung nhìn cho file excel, bảo vệ phân quyền ...

<Styles>
    <Style ss:ID="Default" ss:Name="Normal">
      <Alignment ss:Vertical="Bottom" />
      <Borders />
      <Font />
      <Interior />
      <NumberFormat />
      <Protection />
    </Style>
    <Style ss:ID="s21">
      <Font x:Family="Swiss" ss:Bold="1" />
    </Style>
 </Styles>

Xin bạn đừng lẫn lộn giữa thẻ styles và thẻ Style nhé. Thẻ Styles khai báo đây là vùng khai báo style cho văn bản như kiểu thẻ style trong html ý. Còn thẻ Style là từng loại style riêng biệt được khai báo trước và bạn có thể thay đổi Aligment, Border, font định dạng...., muốn set style mặc định cho văn bản bạn dùng attribute ss:ID="Default" còn khi để tên khác thì nó chỉ set khi được gọi.

<Worksheet ss:Name="Sheet1"></Worksheet>

Đoạn thẻ này khai báo nội dung bên trong là 1 trang sheet với ss:Name là tên của trang sheet. Tóm gọn lại là mỗi trang sheet là 1 thẻ Worksheet.

<Table>
    <Column/>
    <Row>
        <Cell>
            <Data></Data>
        </Cell>
    </Row>
</Table>

Đoạn nội dung bắt đầu của 1 table trong excel thẻ column thật ra là không cần thiết vì nó chỉ định nghĩa style cho 1 cột được chỉ định. Còn đoạn Row,Cell thì cách dùng giống như tr,td trong html chỉ khác 1 chỗ nữa là nội dung ô phải đặt trong thẻ Data, bạn có thể khai báo kiểu cho dữ liệu bên trong để phục vụ cho filter or format cấu trúc. Ví Dụ:

<Data ss:Type="String">Nội Dung Cell</Data>

Với các thuộc tính style được định nghĩa ở trên, bạn có thể thay đổi style cho các Row or column or cell bằng cách khai báo attribute.Ví dụ:

<Column ss:StyleID="DefaultNumber"/>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
      <Print>
        <ValidPrinterInfo />
        <HorizontalResolution>600</HorizontalResolution>
        <VerticalResolution>600</VerticalResolution>
      </Print>
      <Selected />
      <Panes>
        <Pane>
          <Number>3</Number>
          <ActiveRow>5</ActiveRow>
          <ActiveCol>1</ActiveCol>
        </Pane>
      </Panes>
      <ProtectObjects>False</ProtectObjects>
      <ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>

thẻ WorksheetOptions Chứa thông tin về các lựa chọn liên quan đến bảng tính.Đây cũng là đoạn chứa các thông tin nhiều và phức tạp nhất trong Excel XML, bản thân mình cũng không nắm rõ hoàn toàn chỉ khi nào phải làm 1 chức năng nào đó mới lần mò để đọc (thật ra số chức năng mình làm cũng không nhiều). (useless) Có lẽ hôm nào mình sẽ rành ra 1 bài viết riêng về phần này để anh em còn chém gió, và cũng là cho mình thêm thời gian để đọc tài liệu về mảng này.

Tổng kết

Bài post đầu này mình viết mục đích là để tổng kết sơ bộ nhất về những hiểu biết của mình về excel Xml, Mình sẽ viết kĩ hơn về từng phần trong các bài viết lần sau. Hy vọng sẽ giúp mọi người tối giản được phần nào thời gian nghiên cứu. Chủ đề lần sau có lẽ sẽ là về WorksheetOptions hy vọng sẽ có nhiều comment góp ý để nâng cao chất lượng cộng đồng.Thank mọi người vì đã xem đến đây.