Apache的poi到底是一个怎样的东西?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache的poi到底是一个怎样的东西?相关的知识,希望对你有一定的参考价值。
3个问题
1.Apache的poi到底是一个怎样的东西?需要安装才能用的吗????
还是直接用JAVA就可以调用??怎么找不到安装的软件?
2.利用poi能获取远程doc或ppt文档里边的文字内容吗???注意是远程的
在 GrapeCity Documents出现以前,服务端文档组件向来以Apache POI为代表,作为一款由Java编写的开源API库,Apache POI 主要应用于对Microsoft Office文档进行读、写,以及创建和维护。
但正如POI所定义的那样:作为“Poor Obfuscation Implementation”首字母的缩写,Apache POI仅提供“简单的模糊实现”,其在创建复杂逻辑的大型文档时,经常会捉襟见肘。
如果想通过简单的代码逻辑,快速创建、加载、编辑、导入/导出大型文档(Excel、Word、PDF),并将其部署到云端时,又该如何实现?
而这些需求,恰恰是GrapeCity Documents 可以满足的。
GrapeCity Documents 是一款快速且高效的服务端文档组件包,可在 Windows、Mac、Linux 上完美运行,同时适用于 .NET和 Java 平台,可在不依赖 Microsoft Office 和 Acrobat 组件的情况下,提供快速生成、加载、编辑和保存 Excel、PDF、Word文档的功能。
GrapeCity Documents 由四种针对不同文档和开发框架的组件构成:
· 适用于所有 .NET 平台的 Excel 文档 API —— GcExcel(.NET)
· 适用于所有 Java 平台的 Excel 文档 API —— GcExcel(Java)
· 适用于所有 .NET 平台的 PDF 文档 API —— GcPDF
· 适用于所有 .NET 平台的 Word 文档 API —— GcWord
下面,我们将以其中的GcExcel 为例,详细对比它与 Apache POI 的功能及性能优劣。
功能对比:GcExcel VS Apache POI
1. 公式数量
GcExcel支持452种Excel公式。
Apache POI中,支持的公式数量很少(虽然Apache POI网站罗列了280多种可评估的公式,但在API中仅显示为157种)。
2. 是否支持导出PDF
GcExcel不但支持导出PDF格式,还可控制页面设置选项。
Apache POI不支持导出PDF。
3. 条件格式
GcExcel支持多种条件格式,如自定义图标集、判断是否高于平均值(AboveAverage)、发生日期判断、Top 10和重复项判断,且这些条件格式的设置规则与VSTO保持一致。
但在Apache POI中,使用高级API来增加条件格式判断会受限。因此,只能使用标记为内部用途的低级类来处理Top10、高于平均值(AboveAverage)等格式化选项。
4. 图表类型
GcExcel的图表界面与VSTO一致,支持约53种图表类型。
Apache POI对图表的支持非常有限,仅支持Line、Bar、Column、Scatter和Radar图表类型。
5. 迷你图
GcExcel完全支持添加和配置迷你图(Sparklines)。
Apache POI目前不支持Sparklines。
6. 剪切、复制、粘贴形状
GcExcel支持剪切、复制、粘贴形状,Apache POI不支持。
7. 过滤器数据类型
GcExcel广泛支持文本、数字、日期、颜色和图标等过滤器。
Apache POI仅支持基本的AutoFilter,需要使用低级类来实现应用过滤或创建任何其他高级过滤器。
8. 排序
GcExcel支持所有类型的行排序、列排序、自定义排序、颜色和图标排序。
Apache POI没有内置的排序功能。但是,用户可以使用shiftRows()/ ShiftColumns()并以编程方式对数据进行排序。
9. 切片器
GcExcel支持带有数据透视表的切片器,而Apache POI则不支持。
10. 导出CSV格式
GcExcel支持导出为CSV格式。
Apache POI没有提供内置的导出CSV选项。但是,可以使用编程的方式创建相应的CSV / html文件。
11. 渐变填充
GcExcel支持渐变填充,而Apache POI不支持。
12. 单元格中获取/设置值
在对单个单元格执行获取/设置值的情况下,GcExcel比Apache POI表现的更好。
13. 示例与帮助文档
使用Apache POI,许多功能需要访问和了解底层API才能实现, 但Apache POI提供的示例和文档数量十分有限,对于开发人员来说学习成本较大。
而GcExcel作为独立于平台的API 组件,具备高性能、低内存消耗的特点,并且与Excel对象模型严格兼容。GcExcel更加易于使用且功能全面,通过其提供的在线演示示例和帮助文档,开发人员可以快速上手,迅速掌握产品使用技巧。
参考技术A poi是个小框架,其实是个jar包,导入之后java可以直接调用它的类和方法。poi是用来解析excel、word等等文档的工具包。你干嘛远程获取呢,还不如把文件先现在到本地然后解析。对于用户来说就相当于远程获取了呗。这只是一种解决方案,仅作参考。希望能帮得上楼主。追问谢谢您的回答
我是想在html或asp中调用,可以吗???如果想在我自己的电脑上(localhost)用,是不是要先下载jar包???
必须下载jar包,因为这东西是要用java程序调用的。只能在java代码中调用,如果在html或者jsp中使用也只能在java后台调用poi的接口,把数据转化成可以在页面上显示的控件数据,才能显示的。
追问谢谢您的回答
再问最后个问题,npoi呢??是不是也需要下载jar包??是不是在asp中可以调用他??
asp我就不知道了,jsp可以。
参考技术B 是个jar包可以直接调用,以前读写excel文件时用过使用Apache POI时,我可以使用索引遍历excel文件吗?
如果我不清楚,请原谅。英语不是我的第一语言。
我正在尝试编写一个代码,我可以遍历excel文件的第一行,直到找到标记为“Comments”的列。我想对该列中的文本运行一些操作,然后将结果保存在文件末尾的新列中。我可以以类似于索引的方式遍历xlsx文件吗?如果是这样,我怎样才能使用该单元格的坐标直接跳到单元格?
public static void main(String[] args) throws IOException {
File myFile = new File("temp.xlsx");
FileInputStream fis = null;
try {
fis = new FileInputStream(myFile);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
@SuppressWarnings("resource")
XSSFWorkbook myWorkBook = new XSSFWorkbook (fis);
XSSFSheet mySheet = myWorkBook.getSheetAt(0);
Iterator<Row> rowIterator = mySheet.iterator();
Row row = rowIterator.next();
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
String comment = cell.toString();
if (comment.equals("Comments"))
{
System.out.println("Hello");
}
}
}
}
对于“想要进入第二列第3行的问题,我可以使用像(3,2)这样的坐标?”:
是的,这可以使用CellUtil。 Sheet
和Row
方法的优点是CellUtil
方法能够获得细胞(如果它已经存在)或创建细胞(如果它尚不存在)。因此,现有的单元格将被尊重而不是简单地创建它们,因此会覆盖它们。
例:
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.util.CellUtil;
import java.util.concurrent.ThreadLocalRandom;
public class CreateExcelCellsByIndex {
public static void main(String[] args) throws Exception {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet();
//put content in R3C2:
Cell cell = CellUtil.getCell(CellUtil.getRow(3-1, sheet), 2-1); //-1 because apache poi's row and cell indexes are 0 based
cell.setCellValue("R3C2");
//put content in 10 random cells:
for (int i = 1; i < 11; i++) {
int r = ThreadLocalRandom.current().nextInt(4, 11);
int c = ThreadLocalRandom.current().nextInt(1, 6);
cell = CellUtil.getCell(CellUtil.getRow(r-1, sheet), c-1);
String cellcontent = "";
if (cell.getCellTypeEnum() == CellType.STRING) {
cellcontent = cell.getStringCellValue() + " ";
}
cell.setCellValue(cellcontent + i + ":R"+r+"C"+c);
}
workbook.write(new FileOutputStream("CreateExcelCellsByIndex.xlsx"));
workbook.close();
}
}
我不确定你的2D索引是什么意思,但Cell知道它属于哪个列,所以这样的东西应该工作:
...
Cell cell = cellIterator.next();
String comment = cell.toString();
int sourceColumnIndex = -1;
if (comment.equals("Comments")) {
System.out.println("Hello");
sourceColumnIndex = cell.getColumnIndex();
}
....
类似地,定义类似int targetColumnIndex
的东西来表示将处理来自sourceColumnIndex
列的所有单元格的结果的列。
以上是关于Apache的poi到底是一个怎样的东西?的主要内容,如果未能解决你的问题,请参考以下文章
JAVA Apache POI 之sax 解析10万级大数量数据
使用Apache POI时,我可以使用索引遍历excel文件吗?