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)这样的坐标?”:

是的,这可以使用CellUtilSheetRow方法的优点是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到底是一个怎样的东西?的主要内容,如果未能解决你的问题,请参考以下文章

Apache POI:在公式中使用表列名

JAVA Apache POI 之sax 解析10万级大数量数据

easypoi导出excel怎样设置相同内容不合并

使用Apache POI时,我可以使用索引遍历excel文件吗?

JAVA Apache POI 之sax 解析10万级大数量数据

如何使用apache POI和java将一个工作簿工作表复制到另一个工作簿表