Aspose.Cells與Apache POI導(dǎo)出Excel對比


原文: Aspose.Cells與Apache POI導(dǎo)出Excel對比
date: 2019-5-20 15:39:21


[TOC]

1. 文檔說明

使用freemarker導(dǎo)出Excel, 無法直接操作Excel

需要先將Excel模版轉(zhuǎn)換為xml可讀格式作為freemarker的模板文件(.ftl), 再進(jìn)行模版元素和表達(dá)式替換

所以在打開文件時(shí)會有如下提示

文件格式和擴(kuò)展名不匹配, 文件可能已經(jīng)損壞或不安全

需點(diǎn)擊確認(rèn)后才能打開, 影響用戶體驗(yàn)

目的

對比以下兩款產(chǎn)品

  • Apache POI - Java Excel APIs
  • Aspose - Aspose.Cells for java

對比在操作 Excel 的區(qū)別, 解決上述問題, 并考慮兩種產(chǎn)品功能性, 開發(fā)上的區(qū)別


2. Apache POI

Apache POI - the Java API for Microsoft Documents

Apache POI 是 Apache 提供操作 Microsoft Office 的開源庫, 支持多種平臺

環(huán)境

JDK環(huán)境: 1.5 或以上

引入maven依賴, 目前最新的Release版本為4.1.0, 測試使用POI版本為 3.11

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.11</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>3.11</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

代碼示例

<span id="code1">代碼示例</span>

public static void main(String[] args) throws Exception {

    HSSFWorkbook workbook = new HSSFWorkbook();
    HSSFSheet sheet = workbook.createSheet();

    HSSFCell cell = sheet.createRow(0).createCell(0);
    cell.setCellValue("---用戶信息---");
    HSSFCellStyle cellStyle = cell.getCellStyle();

    // 標(biāo)題行合并單元格
    sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));

    // 邊框, 單元格樣式等設(shè)置略...
    List<Map<String, Object>> userList = getUserList();
    for (int i = 0; i < userList.size(); i++) {
        Map<String, Object> user = userList.get(i);
        HSSFRow row = sheet.createRow(i + 1);
        HSSFCell cell1 = row.createCell(0);
        HSSFCell cell2 = row.createCell(1);
        HSSFCell cell3 = row.createCell(2);
        cell1.setCellValue(i + 1);
        cell2.setCellValue(String.valueOf(user.get("name")));
        cell3.setCellValue(String.valueOf(user.get("address")));

        cell1.setCellStyle(cellStyle);
        cell2.setCellStyle(cellStyle);
        cell3.setCellStyle(cellStyle);
    }

    File outFile = new File("G:\\poi_output.xls");
    FileOutputStream outputStream = new FileOutputStream(outFile);
    workbook.write(outputStream);
}
poi導(dǎo)出Excel-用戶信息

3. Aspose Cells

Aspose for Java

Category Archive: Aspose.Total Product Family

  • Aspose為開發(fā)人員提供了廣泛的Java API,用于創(chuàng)建和管理處理文件和不同格式的各種類型的應(yīng)用程序
  • 包含豐富組件:
    • Aspose.Cells處理與Microsoft Excel ? 和OpenOffice電子表格。
    • Aspose.Words for Microsoft Word和OpenOffice文檔。
    • Aspose.Slides for Microsoft PowerPoint和OpenOffice演示文稿文件。
    • Aspose.Pdf用于創(chuàng)建和操作PDF文檔。
    • Aspose.BarCode用于生成和識別條形碼。
    • etc...

Aspose.Cells for Java

Aspose.Cells

Aspose.Cells for Java是一個(gè)Excel?電子表格報(bào)告組件,它使Java應(yīng)用程序無需使用MicrosoftExcel?即可創(chuàng)建和管理Excel?電子表格。

Aspose.Cells for Java是一個(gè)功能非常豐富的組件,它提供的不僅僅是基本的數(shù)據(jù)導(dǎo)出功能。

環(huán)境

JDK環(huán)境: JDK 1.6 或以上

依賴: 在maven構(gòu)建的項(xiàng)目中, 可直接引入Aspose.Cells相關(guān)依賴, 有兩種方式

方式一

  • 添加Repository

    <repository>
      <id>AsposeJavaAPI</id>
      <name>Aspose Java API</name>
      <url>https://repository.aspose.com/repo/</url>
    </repository>
    

    Aspose.Cells for Java非開源

    需要單獨(dú)引入aspose的遠(yuǎn)程倉庫地址, 才能引入aspose相關(guān)jar包, 未提供source包

  • 引入依賴(目前最新版本為 19.4)

    <dependency>
      <groupId>com.aspose</groupId>
      <artifactId>aspose-cells</artifactId>
      <version>19.4</version>
    </dependency>
    <dependency>
      <groupId>com.aspose</groupId>
      <artifactId>aspose-cells</artifactId>
      <version>19.4</version>
      <classifier>javadoc</classifier>
    </dependency>
    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcprov-jdk16</artifactId>
      <version>1.46</version>
    </dependency>
    
  • 修改maven settings

    如果maven配置文件 settings.xml 中的 mirrorOf 配置為 *, 需要修改該配置項(xiàng), 使其能夠從pom中添加的repository下載依賴, 否則不生效, 例如:

    <mirror>
      ...
      <mirrorOf>*,!AsposeJavaAPI</mirrorOf>
      ...
    </mirror>
    

    mirrorOf 中指定的是aspose倉庫的id

方式二

從Aspose官網(wǎng)直接下載 Aspose.Cells for Java 對應(yīng)版本的jar, 添加至項(xiàng)目lib中: Add as Library

適用與非maven構(gòu)建項(xiàng)目

下載地址: https://downloads.aspose.com/cells/java

代碼示例

<span id="code2">代碼示例</span>

public static void main(String[] args) throws Exception {
    String title = "巡檢記錄";
    List<String> columns = Lists.newArrayList(
            "序號", "巡檢編號", "開始時(shí)間", "結(jié)束時(shí)間", "巡線人", "巡線總時(shí)長", "巡線里程(公里)", "事件上報(bào)");
    outFileToStream(title, columns, fetchData());
}

public static void exportExcel(String title, List<String> columns, List<Map<String, String>> dataList) throws Exception {

    Workbook workbook = new Workbook();
    WorksheetCollection worksheets = workbook.getWorksheets();
    Worksheet worksheet = worksheets.get(0);
    Cells cells = worksheet.getCells();

    // 設(shè)置標(biāo)題和列名樣式: 文字加粗, 字體, 大小, 顏色, 居中, 單元格內(nèi)容自動換行
    Style titleStyle = workbook.createStyle();
    titleStyle.getFont().setBold(true);
    titleStyle.setName("宋體");
    titleStyle.getFont().setSize(15);
    titleStyle.setHorizontalAlignment(TextAlignmentType.CENTER);
    titleStyle.setTextWrapped(true);
    wrapperStyle(titleStyle);

    //設(shè)置內(nèi)容樣式: 居中, 文字字體, 文字大小, 單元格內(nèi)容自動換行
    Style contentStyle = workbook.createStyle();
    contentStyle.setHorizontalAlignment(TextAlignmentType.CENTER);

    // 設(shè)置邊框
    wrapperStyle(contentStyle);

    Cell titleCell = cells.get(0, 0);
    titleCell.setValue(title);
    titleCell.setStyle(titleStyle);
    cells.setRowHeight(0, 20);
    cells.setStandardWidth(25);
    cells.merge(0, 0, 1, 8);

    // 列名
    for (int i = 0; i < columns.size(); i++) {
        Cell cell = cells.get(1, i);
        cell.setValue(columns.get(i));
        cell.setStyle(titleStyle);
    }

    for (int i = 0; i < dataList.size(); i++) {
        Map<String, String> data = dataList.get(i);
        cells.get(i + 2, 0).setValue(i + 1);
        cells.get(i + 2, 0).setStyle(contentStyle);
        cells.get(i + 2, 1).setValue("code" + i);
        cells.get(i + 2, 1).setStyle(contentStyle);
        cells.get(i + 2, 2).setValue(data.get("time"));
        cells.get(i + 2, 2).setStyle(contentStyle);
        cells.get(i + 2, 3).setValue(data.get("time"));
        cells.get(i + 2, 3).setStyle(contentStyle);
        cells.get(i + 2, 4).setValue(data.get("inspector"));
        cells.get(i + 2, 4).setStyle(contentStyle);
        cells.get(i + 2, 5).setValue(data.get("wholeTime"));
        cells.get(i + 2, 5).setStyle(contentStyle);
        cells.get(i + 2, 6).setValue(data.get("mileage"));
        cells.get(i + 2, 6).setStyle(contentStyle);
        cells.get(i + 2, 7).setValue(data.get("eventCount"));
        cells.get(i + 2, 7).setStyle(contentStyle);
    }

    workbook.save("G:\\巡檢記錄_export_by_aspose.xls");
}

效果如下

aspose.cell導(dǎo)出Excel-巡檢記錄

Excel轉(zhuǎn)換PDF

Aspose.Cells for Java 從 2.3.0 版本開始引入了Microsoft Excel到PDF的轉(zhuǎn)換, 無需單獨(dú)引入Aspose.PDF, 也無須安裝 Microsoft Office環(huán)境

以Excel轉(zhuǎn)PDF為例

代碼示例

public static void main(String[] args) throws Exception {
    String PATH_LINUX = "/root/office/";
    Workbook wb = new Workbook(PATH_LINUX + "巡檢監(jiān)控?cái)?shù)據(jù)庫表.xlsx");
    File pdfFile = new File(PATH_LINUX + "test.pdf");
    FileOutputStream fileOS = new FileOutputStream(pdfFile);
    wb.save(fileOS, SaveFormat.PDF);
}

說明

Aspose.Cells 中 Excel到PDF的轉(zhuǎn)換有一些限制。電子表格中指定的某些格式設(shè)置可能會丟失,并且不支持所有圖形對象

官網(wǎng)列出了一些限制: Conversion Attributes

實(shí)際測試中, 轉(zhuǎn)換PDF會出現(xiàn)錯(cuò)行

4. 其他

以Excel模版方式導(dǎo)出

除了以上示例的通過API方式操作 Excel 元素樣式并導(dǎo)出, Apache POI 和 Aspose.Cells for java 都支持以Excel模版方式導(dǎo)出

適用于樣式復(fù)雜的Excel導(dǎo)出場景

代碼示例

public static void main(String[] args) throws Exception {

    File file = ResourceUtils.getFile("classpath:export\\userinfo.xls");
    FileInputStream inputStream = new FileInputStream(file);
    
    HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
    HSSFSheet sheet = workbook.getSheetAt(0);
    
    HSSFCell cell = sheet.getRow(0).getCell(0);
    cell.setCellValue("---用戶信息---");
    HSSFCellStyle cellStyle = cell.getCellStyle();
    
    List<Map<String, Object>> userList = getUserList();
    for (int i = 0; i < userList.size(); i++) {
        Map<String, Object> user = userList.get(i);
        HSSFRow row = sheet.createRow(i + 2);
        HSSFCell cell1 = row.createCell(0);
        HSSFCell cell2 = row.createCell(1);
        HSSFCell cell3 = row.createCell(2);
        cell1.setCellValue(i + 1);
        cell2.setCellValue(String.valueOf(user.get("name")));
        cell3.setCellValue(String.valueOf(user.get("address")));
    }
    
    File outFile = new File("G:\\poi_output.xls");
    FileOutputStream outputStream = new FileOutputStream(outFile);
    workbook.write(outputStream);
}

Aspose評估版本&授權(quán)&破解

上面使用的Apose Maven repos中引入的jar是Aspose.Cells for Java 的評估版。

評估版提供與產(chǎn)品的許可版本完全相同的功能, 但是有兩個(gè)限制

  • 第一個(gè)限制:已打開文件的數(shù)量
    運(yùn)行程序時(shí),只能打開100個(gè)Excel文件。如果您的應(yīng)用程序超過此數(shù)量,將引發(fā)異常。

  • 第二個(gè)限制:會自動生成并聚焦到一個(gè)有警告信息的sheet頁

    licensing_evalwarningsheet1.png

生成預(yù)覽文件(如PDF)也會自動添加水印

授權(quán)方式

  • Aspose網(wǎng)站上購買許可證

  • 添加許可文件到項(xiàng)目中

  • 在程序調(diào)用Aspose.Cells for Java API之前設(shè)置Licene授權(quán), 例如:

    License license = new License();
    license.setLicense("license.xml");
    // 操作Excel API 相關(guān)代碼...
    
  • 驗(yàn)證License

    Boolean License.isLicenseSet() // 查看是否授權(quán)
    Date License.getSubscriptionExpireDate() // 查看過期時(shí)間
    

破解版說明

Aspose.Cells for Java 網(wǎng)上的破解方案一般有兩種

  • 方式一: 原始jar + license許可文件

    較老版本中可以找到類似的license許可文件, 例如 license.xml

    <License>
      <Data>
        <Products>
          <Product>Aspose.Total for Java</Product>
          <Product>Aspose.Words for Java</Product>
        </Products>
        <EditionType>Enterprise</EditionType>
        <SubscriptionExpiry>20991231</SubscriptionExpiry>
        <LicenseExpiry>20991231</LicenseExpiry>
        <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
      </Data>
      <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
    </License>
    
  • 方式二: 修改jar + license許可文件

    通過修改并替換原始jar中的字節(jié)碼文件, 改變license驗(yàn)證相關(guān)邏輯, 達(dá)到破解的目的

5. 總結(jié)

Apache POI Java Excel APIs 與 Aspose.Cells for Java 都能歐解決 打開 freemarker 導(dǎo)出的 Excel 文件時(shí)出現(xiàn)的警告提示問題

對比

1. 常用導(dǎo)出場景支持

都支持兩種常用的導(dǎo)出場景:

  • 使用API操作元素導(dǎo)出: 適用于Excel樣式不復(fù)雜
  • 基于Excel模版導(dǎo)出: 適用于導(dǎo)出樣式復(fù)雜的報(bào)表場景, 減少編碼量

2. 文檔轉(zhuǎn)換(Excel轉(zhuǎn)PDF)

Apache POI 無法直接調(diào)用API轉(zhuǎn)換, 需要使用例如jacob調(diào)用Microsoft Office或WPS才能實(shí)現(xiàn)轉(zhuǎn)換

Aspose.Cells for Java 從2.3.0版本后提供了PDF轉(zhuǎn)換功能, 無需引入其它依賴, 也無需安裝MS環(huán)境

但不適用于轉(zhuǎn)換效果要求高, 實(shí)際測試中轉(zhuǎn)換后的PDF會出現(xiàn)錯(cuò)行

3. 開發(fā)便捷

兩者都提供了maven依賴, 可以在maven構(gòu)建的項(xiàng)目中快速集成, 在開發(fā)上, 兩者直接操作Excel的API類似, 并無太大區(qū)別, 詳細(xì)功能代碼差異參考

4. 功能

除了基本的導(dǎo)入, 導(dǎo)出場景, 列舉一些在Aspose.Cell中提供, 而Apache POI中沒有的功能

數(shù)據(jù)處理:

  • 搜索查找數(shù)據(jù): 根據(jù)值查找單元格
  • 計(jì)算值: 通過API使用編程的方式, 計(jì)算單元格中的值
  • 解析數(shù)組/集合中的元素導(dǎo)入工作表 & 從工作表中導(dǎo)出數(shù)據(jù)
  • Aspose.Cells提供了大量內(nèi)置函數(shù)和公式, 類似Excel中的計(jì)算工時(shí)
  • 對數(shù)據(jù)進(jìn)行排序

工作表:

  • 給Excel添加水印
  • 轉(zhuǎn)換為HTML, PDF
  • 顯示和隱藏工作簿的滾動條, 選項(xiàng)卡, 更改選項(xiàng)卡顏色
  • 加密Excel
  • 使用多種編碼讀取CSV文件
  • 創(chuàng)建數(shù)據(jù)透視表

<details>
<summary>展開查看</summary>
<pre><code>
public class void main () {
sss
}
</code></pre>
</details>

Aspose.Cells Apache POI
MS Office環(huán)境 不需要 不需要
支持基于模版導(dǎo)出 支持 支持
開源 否, 收費(fèi) 是, 免費(fèi)
使用難易
功能 豐富 基本
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,928評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內(nèi)容