首页 > 其他分享 >apache poi读取各种文件的方式以及优劣分析

apache poi读取各种文件的方式以及优劣分析

时间:2023-12-25 10:39:06浏览次数:34  
标签:文件 读取 poi org apache import


 文章摘要

        安卓平台上的Apache POI库用于读取和写入Microsoft Office格式的文件,如Excel、Word和PowerPoint。这个库非常强大,因为它允许开发者在安卓应用程序中直接处理这些常见的文件格式。下面是对Apache POI在安卓平台上读取不同文件的方式的分析,包括其优势和劣势,并附有示例代码。

正文

读取Excel文件

        Apache POI提供了HSSF(Horrible SpreadSheet Format)和XSSF(XML SpreadSheet Format)两个包来处理不同版本的Excel文件。HSSF适用于处理.xls(Excel 97-2003)格式的文件,而XSSF适用于处理.xlsx(Excel 2007及更高版本)格式的文件。

使用 HSSFWorkbook 和 XSSFWorkbook

优点

        Apache POI提供了丰富的API来处理Excel的各种特性,如样式、公式、数据验证等。

        支持读取 .xls 和 .xlsx 文件。

缺点

        对于大型Excel文件,由于需要将整个文件加载到内存中,可能会导致内存溢出。此外,处理复杂的公式和图表可能需要更深入的理解和编码。

        不支持读取 .xlsm 文件。

代码示例
	import org.apache.poi.ss.usermodel.*;
   import org.apache.poi.xssf.usermodel.XSSFWorkbook;

   try (InputStream fis = new FileInputStream("your_file.xlsx");
        Workbook workbook = new XSSFWorkbook(fis)) {
       Sheet sheet = workbook.getSheetAt(0);
       for (Row row : sheet) {
           for (Cell cell : row) {
               String cellValue = "";
               switch (cell.getCellType()) {
                   case STRING:
                       cellValue = cell.getStringCellValue();
                       break;
                   case NUMERIC:
                       cellValue = String.valueOf(cell.getNumericCellValue());
                       break;
                   // 处理其他类型的单元格...
               }
               System.out.print(cellValue + "\t");
           }
           System.out.println();
       }
   } catch (IOException e) {
       e.printStackTrace();
   }

apache poi读取各种文件的方式以及优劣分析_EXCEL

使用 OPCPackage 和 XSSFWorkbook

优点

        支持读取 .xlsm 文件。

缺点

        不支持读取 .xls 文件

代码示例
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Cell;
import java.io.File;
import java.io.IOException;

public class ReadExcel {
    public static void main(String[] args) {
        String filePath = "path/to/your/excel/file.xlsm";
        try {
            OPCPackage pkg = OPCPackage.open(new File(filePath));
            Workbook workbook = new XSSFWorkbook(pkg);
            Sheet sheet = workbook.getSheetAt(0);
            Row row = sheet.getRow(0);
            Cell cell = row.getCell(0);
            System.out.println(cell.getStringCellValue());

            workbook.close();
            pkg.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

apache poi读取各种文件的方式以及优劣分析_EXCEL_02

读取Word文件

使用 HWPFDocument 和 XWPFDocument

        Apache POI的HWPF(Horrible Word Processor Format)和XWPF(XML Word Processor Format)包分别用于处理.doc和.docx格式的Word文件。

优点

        可以处理Word文档的基本结构和文本内容。

        支持读取 .doc 和 .docx 文件。

缺点

        对复杂格式的支持不如处理Excel那么全面,如页眉、页脚、脚注、尾注等。

        不支持读取 .docm 文件。

代码示例
	import org.apache.poi.xwpf.usermodel.*;

   try (InputStream fis = new FileInputStream("your_file.docx");
        XWPFDocument document = new XWPFDocument(fis)) {
       for (IBodyElement element : document.getBodyElements()) {
           if (element instanceof XWPFParagraph) {
               XWPFParagraph paragraph = (XWPFParagraph) element;
               System.out.println(paragraph.getText());
           } else if (element instanceof XWPFTable) {
               // 处理表格...
           }
       }
   } catch (IOException e) {
       e.printStackTrace();
   }

apache poi读取各种文件的方式以及优劣分析_EXCEL_03

使用 POIXMLDocument 和 XWPFDocument

优点

        支持读取 .docm 文件。

缺点

        不支持读取 .doc 文件。

代码示例
import org.apache.poi.POIXMLDocument;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ReadWord {
    public static void main(String[] args) {
        String filePath = "path/to/your/word/file.docm";
        try {
            FileInputStream inputStream = new FileInputStream(filePath);
            POIXMLDocument document = new XWPFDocument(inputStream);
            XWPFWordExtractor extractor = new XWPFWordExtractor((XWPFDocument) document);
            System.out.println(extractor.getText());
            extractor.close();
            inputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

apache poi读取各种文件的方式以及优劣分析_EXCEL_04

读取PowerPoint文件

使用 HSLFSlideShow 和 XMLSlideShow

        Apache POI的HSLF(Horrible Slide Show Format)和XSLF(XML Slide Show Format)包分别用于处理.ppt和.pptx格式的PowerPoint文件。

优点

        可以处理PowerPoint的基本元素,如幻灯片、文本框、图片等。

缺点

        对复杂动画和过渡效果的支持有限。

        性能较差,对于大型文件可能不太适用。

代码示例
	import org.apache.poi.xslf.usermodel.*;

   try (InputStream fis = new FileInputStream("your_file.pptx");
        XMLSlideShow ppt = new XMLSlideShow(fis)) {
       for (XSLFSlide slide : ppt.getSlides()) {
           System.out.println("Slide: " + slide.getTitle());
           for (XSLFShape shape : slide.getShapes()) {
               if (shape instanceof XSLFTextShape) {
                   XSLFTextShape textShape = (XSLFTextShape) shape;
                   System.out.println(textShape.getText());
               }
           }
       }
   } catch (IOException e) {
       e.printStackTrace();
   }

apache poi读取各种文件的方式以及优劣分析_PPT_05

总结

        Apache POI是一个强大的工具,可以方便地处理各种Microsoft Office文件。

        对于简单的文件格式和内容,Apache POI的使用相对直接和简单。

        针对大型或复杂格式的文件,Apache POI可能需要更多的内存和更复杂的代码来处理。

        在处理大量数据或复杂格式时,需要注意性能优化和内存管理,避免内存溢出等问题。

        在实际使用中,应根据具体需求和文件类型选择合适的处理方式,并结合适当的错误处理和资源管理策略,以确保代码的稳定性和效率。


标签:文件,读取,poi,org,apache,import
From: https://blog.51cto.com/u_16423321/8963713

相关文章

  • 在Python中实现ESG(环境、社会、治理)因子的交易策略,我们可以使用pandas库来读取数据,并
    在Python中实现ESG(环境、社会、治理)因子的交易策略,我们可以使用pandas库来读取数据,并使用AlphaVantage提供的API来获取股票价格数据²。以下是一个简单的代码示例:importpandasaspdimportrequests#获取股票价格数据response=requests.get(alpha_vantage_url)data=res......
  • Apache Commons IO: 简化文件和IO操作
    第1章:引言咱们在做Java编程的时候,经常会遇到各种文件操作和输入输出(IO)的问题。不论是读取一个配置文件,还是把数据写入日志,这些看似简单的任务有时候会让人头疼。传统的JavaIO操作,虽然功能强大,但往往代码冗长,而且容易出错。这时候,ApacheCommonsIO库就像一股清泉,为咱们简化这些......
  • spring:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/comm
    Java运行时环境中找不到org.apache.commons.logging.LogFactory这个类。  在maven中导入依赖即可 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version><!-......
  • 浏览器通过USB连接移动设备读取设备信息
     注意:一般情况下,浏览器只允许通过安全的传输协议(如HTTPS)或者本地的localhost和file协议来访问USB设备这些限制是为了确保用户的隐私和安全。使用HTTPS协议可以加密数据传输,从而减少数据被窃取或篡改的风险。而本地的localhost和file协议则主要用于本地开发和测试环境,可以避免通......
  • org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis
    Requestprocessingfailed;nestedexceptionisorg.mybatis.spring.MyBatisSystemException:nestedexceptionisorg.apache.ibatis.binding.BindingException:Parameter'keyWord'notfound.Availableparametersare[keyword,param1] 错误原因:我在mapper里加......
  • 抓取java堆栈失败的思考-Safepoint等的学习
    抓取java堆栈失败的思考-Safepoint等的学习背景前期解决问题都是靠抓取进程堆栈jstack,后者是jmap到内存dump的方式来进行分析.最近连续有两个比较大的项目出现了抓取dump/stack失败的情况.具体原因可能还不太一样.周末再翻找之前的资料时猜到了可能得几个原因.想总结......
  • 【poi】使用poi时报错:java.io.EOFException: Unexpected end of ZLIB input stream
    错误写法Workbookworkbook=null;try{//会报错Filefile=newFile("D:\\1.xlsx");workbook=newXSSFWorkbook(file);ByteArrayOutputStreambaos=newByteArrayOutputStream(); workbook.write(baos); workbook.close(); bytes=baos......
  • Java Spring Boot 配置读取进阶篇-@ConfigurationProperties && @Value
    之前我们学习了在SpringBoot如何读取application.properties/application.yaml配置文件的配置信息,在上文中我们主要是简单地实践了些简单的设置,这次我们带着同样的问题,如果配置更加复杂,我们的配置读取又应该怎么处理呢。本文的学习主要基于SpringBoot自带的库来解析配置,......
  • Apache 介绍
    Apache基金会Apache软件基金会(ApacheSoftwareFoundation),简写为ASF。是一个负责管理Apache项目的开源基金会。例如:ApacheHTTPServer、ApacheHTTPServer、ApacheHTTPServer、ApacheKafka、ApacheTomcat以及ApacheZooKeeper都是Apache基金会中的开源项目。Apache基......
  • [C++] 强制类型转换(dynamic_cast和dynamic_Pointer_cast)
    作者:丶布布1、指引或者引用的向上转换,向下转换例如基类Father,Son继承Father,派生类Son.。Father—>Son则为向下转换,Son—>Father则为向上转换。向上转换为隐士转换,向下转换需要dynamic_cast或者c的转换方式。向上转换:structFather{//基类Father};structSon:Father{//......