原文: 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);
}
3. Aspose Cells
Aspose for Java
- 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 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)目
代碼示例
<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");
}
效果如下
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) |
使用難易 | 易 | 易 |
功能 | 豐富 | 基本 |