poi读写office_poi读写word - CSDN
  • 目录 1 读word doc文件 1.1 通过WordExtractor读文件 ... Apache poi的hwpf模块是专门用来对word doc文件进行读写操作的。在hwpf里面我们使用HWPFDocument来表示一个word doc文档。在HWPFDocument

    目录

    1     word doc文件

    1.1     通过WordExtractor读文件

    1.2     通过HWPFDocument读文件

    2     word doc文件

     

           Apache poi的hwpf模块是专门用来对word doc文件进行读写操作的。在hwpf里面我们使用HWPFDocument来表示一个word doc文档。在HWPFDocument里面有这么几个概念:

    Range:它表示一个范围,这个范围可以是整个文档,也可以是里面的某一小节(Section),也可以是某一个段落(Paragraph),还可以是拥有共同属性的一段文本(CharacterRun)。

    Section:word文档的一个小节,一个word文档可以由多个小节构成。

    Paragraph:word文档的一个段落,一个小节可以由多个段落构成。

    CharacterRun:具有相同属性的一段文本,一个段落可以由多个CharacterRun组成。

    Table:一个表格。

    TableRow:表格对应的行。

    TableCell:表格对应的单元格。

           Section、Paragraph、CharacterRun和Table都继承自Range。

    1       读word doc文件

           在日常应用中,我们从word文件里面读取信息的情况非常少见,更多的还是把内容写入到word文件中。使用POI从word doc文件读取数据时主要有两种方式:通过WordExtractor读和通过HWPFDocument读。在WordExtractor内部进行信息读取时还是通过HWPFDocument来获取的。

     

    1.1     通过WordExtractor读文件

           在使用WordExtractor读文件时我们只能读到文件的文本内容和基于文档的一些属性,至于文档内容的属性等是无法读到的。如果要读到文档内容的属性则需要使用HWPFDocument来读取了。下面是使用WordExtractor读取文件的一个示例:

    Java代码  收藏代码

     

        public class HwpfTest {  
           
           @SuppressWarnings("deprecation")  
           @Test  
           public void testReadByExtractor() throws Exception {  
              InputStream is = new FileInputStream("D:\\test.doc");  
              WordExtractor extractor = new WordExtractor(is);  
              //输出word文档所有的文本  
              System.out.println(extractor.getText());  
              System.out.println(extractor.getTextFromPieces());  
              //输出页眉的内容  
              System.out.println("页眉:" + extractor.getHeaderText());  
              //输出页脚的内容  
              System.out.println("页脚:" + extractor.getFooterText());  
              //输出当前word文档的元数据信息,包括作者、文档的修改时间等。  
              System.out.println(extractor.getMetadataTextExtractor().getText());  
              //获取各个段落的文本  
              String paraTexts[] = extractor.getParagraphText();  
              for (int i=0; i<paraTexts.length; i++) {  
                 System.out.println("Paragraph " + (i+1) + " : " + paraTexts[i]);  
              }  
              //输出当前word的一些信息  
              printInfo(extractor.getSummaryInformation());  
              //输出当前word的一些信息  
              this.printInfo(extractor.getDocSummaryInformation());  
              this.closeStream(is);  
           }  
            
           /** 
            * 输出SummaryInfomation 
            * @param info 
            */  
           private void printInfo(SummaryInformation info) {  
              //作者  
              System.out.println(info.getAuthor());  
              //字符统计  
              System.out.println(info.getCharCount());  
              //页数  
              System.out.println(info.getPageCount());  
              //标题  
              System.out.println(info.getTitle());  
              //主题  
              System.out.println(info.getSubject());  
           }  
            
           /** 
            * 输出DocumentSummaryInfomation 
            * @param info 
            */  
           private void printInfo(DocumentSummaryInformation info) {  
              //分类  
              System.out.println(info.getCategory());  
              //公司  
              System.out.println(info.getCompany());  
           }  
            
           /** 
            * 关闭输入流 
            * @param is 
            */  
           private void closeStream(InputStream is) {  
              if (is != null) {  
                 try {  
                    is.close();  
                 } catch (IOException e) {  
                    e.printStackTrace();  
                 }  
              }  
           }  
            
        }  

     

    1.2     通过HWPFDocument读文件

           HWPFDocument是当前Word文档的代表,它的功能比WordExtractor要强。通过它我们可以读取文档中的表格、列表等,还可以对文档的内容进行新增、修改和删除操作。只是在进行完这些新增、修改和删除后相关信息是保存在HWPFDocument中的,也就是说我们改变的是HWPFDocument,而不是磁盘上的文件。如果要使这些修改生效的话,我们可以调用HWPFDocument的write方法把修改后的HWPFDocument输出到指定的输出流中。这可以是原文件的输出流,也可以是新文件的输出流(相当于另存为)或其它输出流。下面是一个通过HWPFDocument读文件的示例:

    Java代码  收藏代码

        public class HwpfTest {  
            
           @Test  
           public void testReadByDoc() throws Exception {  
              InputStream is = new FileInputStream("D:\\test.doc");  
              HWPFDocument doc = new HWPFDocument(is);  
              //输出书签信息  
              this.printInfo(doc.getBookmarks());  
              //输出文本  
              System.out.println(doc.getDocumentText());  
              Range range = doc.getRange();  
        //    this.insertInfo(range);  
              this.printInfo(range);  
              //读表格  
              this.readTable(range);  
              //读列表  
              this.readList(range);  
              //删除range  
              Range r = new Range(2, 5, doc);  
              r.delete();//在内存中进行删除,如果需要保存到文件中需要再把它写回文件  
              //把当前HWPFDocument写到输出流中  
              doc.write(new FileOutputStream("D:\\test.doc"));  
              this.closeStream(is);  
           }  
            
           /** 
            * 关闭输入流 
            * @param is 
            */  
           private void closeStream(InputStream is) {  
              if (is != null) {  
                 try {  
                    is.close();  
                 } catch (IOException e) {  
                    e.printStackTrace();  
                 }  
              }  
           }  
            
           /** 
            * 输出书签信息 
            * @param bookmarks 
            */  
           private void printInfo(Bookmarks bookmarks) {  
              int count = bookmarks.getBookmarksCount();  
              System.out.println("书签数量:" + count);  
              Bookmark bookmark;  
              for (int i=0; i<count; i++) {  
                 bookmark = bookmarks.getBookmark(i);  
                 System.out.println("书签" + (i+1) + "的名称是:" + bookmark.getName());  
                 System.out.println("开始位置:" + bookmark.getStart());  
                 System.out.println("结束位置:" + bookmark.getEnd());  
              }  
           }  
            
           /** 
            * 读表格 
            * 每一个回车符代表一个段落,所以对于表格而言,每一个单元格至少包含一个段落,每行结束都是一个段落。 
            * @param range 
            */  
           private void readTable(Range range) {  
              //遍历range范围内的table。  
              TableIterator tableIter = new TableIterator(range);  
              Table table;  
              TableRow row;  
              TableCell cell;  
              while (tableIter.hasNext()) {  
                 table = tableIter.next();  
                 int rowNum = table.numRows();  
                 for (int j=0; j<rowNum; j++) {  
                    row = table.getRow(j);  
                    int cellNum = row.numCells();  
                    for (int k=0; k<cellNum; k++) {  
                        cell = row.getCell(k);  
                        //输出单元格的文本  
                        System.out.println(cell.text().trim());  
                    }  
                 }  
              }  
           }  
            
           /** 
            * 读列表 
            * @param range 
            */  
           private void readList(Range range) {  
              int num = range.numParagraphs();  
              Paragraph para;  
              for (int i=0; i<num; i++) {  
                 para = range.getParagraph(i);  
                 if (para.isInList()) {  
                    System.out.println("list: " + para.text());  
                 }  
              }  
           }  
            
           /** 
            * 输出Range 
            * @param range 
            */  
           private void printInfo(Range range) {  
              //获取段落数  
              int paraNum = range.numParagraphs();  
              System.out.println(paraNum);  
              for (int i=0; i<paraNum; i++) {  
        //       this.insertInfo(range.getParagraph(i));  
                 System.out.println("段落" + (i+1) + ":" + range.getParagraph(i).text());  
                 if (i == (paraNum-1)) {  
                    this.insertInfo(range.getParagraph(i));  
                 }  
              }  
              int secNum = range.numSections();  
              System.out.println(secNum);  
              Section section;  
              for (int i=0; i<secNum; i++) {  
                 section = range.getSection(i);  
                 System.out.println(section.getMarginLeft());  
                 System.out.println(section.getMarginRight());  
                 System.out.println(section.getMarginTop());  
                 System.out.println(section.getMarginBottom());  
                 System.out.println(section.getPageHeight());  
                 System.out.println(section.text());  
              }  
           }  
            
           /** 
            * 插入内容到Range,这里只会写到内存中 
            * @param range 
            */  
           private void insertInfo(Range range) {  
              range.insertAfter("Hello");  
           }  
            
        }  

     

    2       写word doc文件

           在使用POI写word doc文件的时候我们必须要先有一个doc文件才行,因为我们在写doc文件的时候是通过HWPFDocument来写的,而HWPFDocument是要依附于一个doc文件的。所以通常的做法是我们先在硬盘上准备好一个内容空白的doc文件,然后建立一个基于该空白文件的HWPFDocument。之后我们就可以往HWPFDocument里面新增内容了,然后再把它写入到另外一个doc文件中,这样就相当于我们使用POI生成了word doc文件。

           在实际应用中,我们在生成word文件的时候都是生成某一类文件,该类文件的格式是固定的,只是某些字段不一样罢了。所以在实际应用中,我们大可不必将整个word文件的内容都通过HWPFDocument生成。而是先在磁盘上新建一个word文档,其内容就是我们需要生成的word文件的内容,然后把里面一些属于变量的内容使用类似于“${paramName}”这样的方式代替。这样我们在基于某些信息生成word文件的时候,只需要获取基于该word文件的HWPFDocument,然后调用Range的replaceText()方法把对应的变量替换为对应的值即可,之后再把当前的HWPFDocument写入到新的输出流中。这种方式在实际应用中用的比较多,因为它不但可以减少我们的工作量,还可以让文本的格式更加的清晰。下面我们就来基于这种方式做一个示例。

           假设我们现在拥有一些变动的信息,然后需要通过这些信息生成如下格式的word doc文件:



     

           那么根据上面的描述,首先第一步,我们建立一个对应格式的doc文件作为模板,其内容是这样的:



     

           有了这样一个模板之后,我们就可以建立对应的HWPFDocument,然后替换对应的变量为相应的值,再把HWPFDocument输出到对应的输出流即可。下面是对应的代码。

    Java代码  收藏代码

        public class HwpfTest {  
            
           @Test  
           public void testWrite() throws Exception {  
              String templatePath = "D:\\word\\template.doc";  
              InputStream is = new FileInputStream(templatePath);  
              HWPFDocument doc = new HWPFDocument(is);  
              Range range = doc.getRange();  
              //把range范围内的${reportDate}替换为当前的日期  
              range.replaceText("${reportDate}", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));  
              range.replaceText("${appleAmt}", "100.00");  
              range.replaceText("${bananaAmt}", "200.00");  
              range.replaceText("${totalAmt}", "300.00");  
              OutputStream os = new FileOutputStream("D:\\word\\write.doc");  
              //把doc输出到输出流中  
              doc.write(os);  
              this.closeStream(os);  
              this.closeStream(is);  
           }  
            
           /** 
            * 关闭输入流 
            * @param is 
            */  
           private void closeStream(InputStream is) {  
              if (is != null) {  
                 try {  
                    is.close();  
                 } catch (IOException e) {  
                    e.printStackTrace();  
                 }  
              }  
           }  
           
           /** 
            * 关闭输出流 
            * @param os 
            */  
           private void closeStream(OutputStream os) {  
              if (os != null) {  
                 try {  
                    os.close();  
                 } catch (IOException e) {  
                    e.printStackTrace();  
                 }  
              }  
           }  
            
           
        }  

     

    (注:本文是基于poi3.9所写)





    展开全文
  • POI读写Office2007

    2009-12-30 10:10:00
    先写下资源,以后读写office会持续更新 poi主页:http://poi.apache.org/ poi类库及原文件下载:http://poi.apache.org/download.html 或maven库: ...

    先写下资源,以后读写office会持续更新

    poi主页:http://poi.apache.org/

    poi类库及原文件下载:http://poi.apache.org/download.html 或maven库: http://repo1.maven.org/maven2/org/apache/poi/

    poi-ooxml-schemas http://repo1.maven.org/maven2/org/apache/poi/poi-ooxml-schemas/3.6/

     

    以下资源不容易找到,我也花了几天时间,分享给大家

    OfficeOpenXML-XMLSchema: http://download.csdn.net/source/1947457

    poi OfficeOpenXML Schema openxmlformats源文件 poi-ooxml-schemas-*.jar http://download.csdn.net/source/1947498 这是我用poi的ant compile-ooxml-xsds编译的。如果你自己编译这要用到OfficeOpenXML-XMLSchema文件。

    展开全文
  • Apache POI是Apache软件基金会的开放源码函式库,官方名称为:Apache POI - the Java API for Microsoft Documents,POI提供API给Java程序对Microsoft Office格式文档读和写的功能。 .NET的开发人员则可以利用NPOI ...

    1.Apache POI简介

                Apache POI是Apache软件基金会的开放源码函式库,官方名称为:Apache POI - the Java API for Microsoft Documents,POI提供API给Java程序对Microsoft Office格式文档读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 POI 的功能。


    2.Apache POI结构

    HSSF - 提供读写Microsoft Excel XLS格式档案的功能。

    XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。

    HWPF - 提供读写Microsoft Word DOC格式档案的功能。

    HSLF - 提供读写Microsoft PowerPoint格式档案的功能。

    HDGF - 提供读Microsoft Visio格式档案的功能。

    HPBF - 提供读Microsoft Publisher格式档案的功能。

    HSMF - 提供读Microsoft Outlook格式档案的功能。

    3.Apache POI应用实例:

    <1>首先需要从阿帕奇官网下载poi的jar文件;

    <2>配置完jar文件之后,就可以运行下面的实例了

           这里仅用读写Excel表格的简单例子演示:


    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    
    import java.io.FileInputStream;
    import java .io.FileOutputStream;
    public class CreateExcel
    {
    	/* Excel 文件要存放的位置:D盘*/
    	public static String outputFile="D:\\test.xls";
    	public static void main(String argv[])
    	{
    		readSheet();
    	}
    	//演示如何利用Jakarta POI API 创建Excel 文档。
    	public static void createSheet()
    	{
    		try{
    			// 创建新的Excel 工作簿
    			HSSFWorkbook workbook = new HSSFWorkbook();
    			//如要新建一名为"效益指标"的工作表,其语句为:
    			HSSFSheet sheet = workbook.createSheet("效益指标");
    			// 在Excel工作簿中建一工作表,其名为缺省值,
    			//HSSFSheet sheet = workbook.createSheet();
    			
    			// 在索引0的位置创建行(最顶端的行)
    			HSSFRow row = sheet.createRow(0);
    			//在索引0的位置创建单元格(左上端)
    			 HSSFCell cell =row.createCell(0);
    			// 定义单元格为字符串类型
    			cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    			// 在单元格中输入一些内容
    			cell.setCellValue("增加值");
    			
    			
    			// 新建一输出文件流
    			FileOutputStream fOut = new FileOutputStream(outputFile);
    			// 把相应的Excel 工作簿存盘
    			workbook.write(fOut);
    			fOut.flush();
    			
    			// 操作结束,关闭文件
    			fOut.close();
    			System.out.println("生成文件...........");
    		}
    		catch(Exception e)
    		{
    			System.out.println("!!!!!!" + e.getMessage());
    		}
    	}
    	
    	//演示如何读取Excel文档中的数据
    	public static void readSheet()
    	{
    		try{
    			// 创建对Excel工作簿文件的引用
    			HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(outputFile));
    			// 创建对工作表的引用。
    			// 本例是按名引用
    			HSSFSheet sheet = workbook.getSheet("效益指标");
    			// 也可用getSheetAt(int index)按索引引用,
    			// 在Excel文档中,第一张工作表的缺省索引是0,
    			// 其语句为:HSSFSheet sheet = workbook.getSheetAt(0);
    			// 读取左上端单元
    			HSSFRow row = sheet.getRow(0);
    			HSSFCell cell = row.getCell(0);
    			// 输出单元内容,cell.getStringCellValue()就是取所在单元的值
    			System.out.println("左上端单元是: " + cell.getStringCellValue());
    		}
    		catch(Exception e) 
    		{
    			System.out.println("!!!! " + e );
    		}
    	}	
    }
    


    展开全文
  • Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 包名称说明: HSSF提供读写Microsoft Excel XLS格式档案的功能。 XSSF提供读写Microsoft Excel OOXML ...
  • Java使用POI读写Excel文档1 背景2 目标效果3 创建Java程序3.1 版本说明3.2 创建项目4 测试 1 背景 Java程序猿在做业务系统时,经常会遇到自动生成Excel文档或者从Excel文档批量导入数据的需求,因此,掌握Java操作...

    1 背景

    Java程序猿在做业务系统时,经常会遇到自动生成Excel文档或者从Excel文档批量导入数据的需求,因此,掌握Java操作Excel文档的技术极其重要。

    Java操作Excel文档的技术方案较多,本文使用最常用的Java + POI的方案,包括:自动生成Excel文档、从Excel文档批量导入数据。

    2 目标效果

    本文目标是:首先自动生成如下图所示的Excel文档,然后再从自动生成的Excel文档中批量导入数据:
    在这里插入图片描述

    3 创建Java程序

    3.1 版本说明

    1. Spring Boot: 2.1.13
    2. Apache POI: 4.0.1
    3. JDK: 1.8
    4. IDE: IDEA
    5. Office Excel: 2010

    3.2 创建项目

    创建一个名为Excel的Spring Boot项目,并添加maven依赖和相应的Java代码,最后的项目结构如下图所示:
    在这里插入图片描述
    pom.xml文件内容如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.office.excel</groupId>
        <artifactId>office-excel</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>Excel</name>
        <description>Java使用POI操作Excel文档示例</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.3.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>4.0.1</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.0.1</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    

    User类程序如下所示:

    package com.office.excel.model;
    
    /**
     * 用户信息封装类
     */
    public class User {
    
        private Long id;
        private String name;
        private Boolean sex;
        private Integer age;
        private String birthday;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Boolean getSex() {
            return sex;
        }
    
        public void setSex(Boolean sex) {
            this.sex = sex;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getBirthday() {
            return birthday;
        }
    
        public void setBirthday(String birthday) {
            this.birthday = birthday;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", sex=" + sex +
                    ", age=" + age +
                    ", birthday='" + birthday + '\'' +
                    '}';
        }
    }
    

    ExcelUtil类程序如下所示:

    package com.office.excel.util;
    
    import com.office.excel.model.User;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.BorderStyle;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.CellStyle;
    import org.apache.poi.ss.usermodel.CellType;
    import org.apache.poi.ss.usermodel.Font;
    import org.apache.poi.ss.usermodel.HorizontalAlignment;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.VerticalAlignment;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.ss.util.CellRangeAddress;
    import org.apache.poi.ss.util.RegionUtil;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Excel文档工具类
     */
    public class ExcelUtil {
    
        /**
         * 把数据写入到Excel文件
         * @param fileName 自动生成的Excel文件的全路径文件名称
         * @param users 要写入到Excel文件中的数据
         */
        public static void writeExcel(String fileName, List<User> users) throws IOException {
            Workbook workbook = null;
            Sheet sheet = null;
            Row row = null;
            Cell cell = null;
    
            //创建Excel文件
            File excelFile = new File(fileName.trim());
    
            //创建Excel工作薄
            if (excelFile.getName().endsWith("xlsx")) {
                workbook = new XSSFWorkbook();
            } else {
                workbook = new HSSFWorkbook();
            }
    
            //创建Excel表单
            sheet = workbook.createSheet();
    
            //设置列宽,宽度为256的整数倍
            sheet.setColumnWidth(1, 5120);
            sheet.setColumnWidth(2, 3840);
            sheet.setColumnWidth(3, 2560);
            sheet.setColumnWidth(4, 2560);
            sheet.setColumnWidth(5, 5120);
    
            //设置默认行高(默认为300)
            sheet.setDefaultRowHeight((short) 512);
    
            //设置合并单元格
            CellRangeAddress titleCellAddresses = new CellRangeAddress(1,2,1,5);
            sheet.addMergedRegion(titleCellAddresses);
    
            //创建标题行
            row = sheet.createRow(1);
            cell = row.createCell(1, CellType.STRING);
            cell.setCellStyle(getTitleCellStyle(workbook));
            cell.setCellValue("User信息表格");
    
            //设置合并单元格的边框,这个需要放在创建标题行之后
            setRegionBorderStyle(BorderStyle.THIN, titleCellAddresses, sheet);
    
            //创建表头行
            row = sheet.createRow(3);
            cell = row.createCell(1, CellType.STRING);
            cell.setCellStyle(getHeaderCellStyle(workbook));
            cell.setCellValue("ID");
            cell = row.createCell(2, CellType.STRING);
            cell.setCellStyle(getHeaderCellStyle(workbook));
            cell.setCellValue("姓名");
            cell = row.createCell(3, CellType.STRING);
            cell.setCellStyle(getHeaderCellStyle(workbook));
            cell.setCellValue("性别");
            cell = row.createCell(4, CellType.STRING);
            cell.setCellStyle(getHeaderCellStyle(workbook));
            cell.setCellValue("年龄");
            cell = row.createCell(5, CellType.STRING);
            cell.setCellStyle(getHeaderCellStyle(workbook));
            cell.setCellValue("生日");
    
            //创建表体行
            for(int i = 0; i < users.size(); i++) {
                row = sheet.createRow(i + 4);
                cell = row.createCell(1, CellType.NUMERIC);
                cell.setCellStyle(getBodyCellStyle(workbook));
                cell.setCellValue(users.get(i).getId());
                cell = row.createCell(2, CellType.STRING);
                cell.setCellStyle(getBodyCellStyle(workbook));
                cell.setCellValue(users.get(i).getName());
                cell = row.createCell(3, CellType.BOOLEAN);
                cell.setCellStyle(getBodyCellStyle(workbook));
                cell.setCellValue(users.get(i).getSex());
                cell = row.createCell(4, CellType.NUMERIC);
                cell.setCellStyle(getBodyCellStyle(workbook));
                cell.setCellValue(users.get(i).getAge());
                cell = row.createCell(5, CellType.STRING);
                cell.setCellStyle(getBodyCellStyle(workbook));
                cell.setCellValue(users.get(i).getBirthday());
            }
    
            //把Excel工作薄写入到Excel文件
            FileOutputStream os = new FileOutputStream(excelFile);
            workbook.write(os);
            os.flush();
            os.close();
        }
    
        /**
         * 从Excel文件读取数据
         * @param fileName 要读取的Excel文件的全路径文件名称
         * @return 从Excel文件中批量导入的用户数据
         */
        public static List<User> readExcel(String fileName) throws IOException {
            Workbook workbook = null;
            Sheet sheet = null;
            Row row = null;
    
            //读取Excel文件
            File excelFile = new File(fileName.trim());
            InputStream is = new FileInputStream(excelFile);
    
            //获取Excel工作薄
            if (excelFile.getName().endsWith("xlsx")) {
                workbook = new XSSFWorkbook(is);
            } else {
                workbook = new HSSFWorkbook(is);
            }
            if (workbook == null) {
                System.err.println("Excel文件有问题,请检查!");
                return null;
            }
    
            //获取Excel表单
            sheet = workbook.getSheetAt(0);
    
            List<User> users = new ArrayList<>();
            for(int rowNum = 4; rowNum <= sheet.getLastRowNum(); rowNum++) {
                //获取一行
                row = sheet.getRow(rowNum);
                User user = new User();
                user.setId(Long.valueOf(getStringValue(row.getCell(1))));
                user.setName(getStringValue(row.getCell(2)));
                user.setSex(Boolean.valueOf(getStringValue(row.getCell(3))));
                user.setAge(Integer.valueOf(getStringValue(row.getCell(4))));
                user.setBirthday(getStringValue(row.getCell(5)));
                users.add(user);
            }
            is.close();
            return users;
        }
    
        /**
         * 设置合并单元格的边框
         * @param style 要设置的边框的样式
         * @param cellAddresses 要设置的合并的单元格
         * @param sheet 要设置的合并的单元格所在的表单
         */
        private static void setRegionBorderStyle(BorderStyle style, CellRangeAddress cellAddresses, Sheet sheet) {
            RegionUtil.setBorderTop(style, cellAddresses, sheet);
            RegionUtil.setBorderBottom(style, cellAddresses, sheet);
            RegionUtil.setBorderLeft(style, cellAddresses, sheet);
            RegionUtil.setBorderRight(style, cellAddresses, sheet);
        }
    
        /**
         * 设置普通单元格的边框
         * @param style 要设置的边框的样式
         * @param cellStyle 单元格样式对象
         */
        private static void setCellBorderStyle(BorderStyle style, CellStyle cellStyle) {
            cellStyle.setBorderTop(style);
            cellStyle.setBorderBottom(style);
            cellStyle.setBorderLeft(style);
            cellStyle.setBorderRight(style);
        }
    
        /**
         * 设置标题单元格样式
         * @param workbook 工作薄对象
         * @return 单元格样式对象
         */
        private static CellStyle getTitleCellStyle(Workbook workbook) {
            CellStyle cellStyle = workbook.createCellStyle();
    
            //设置字体
            Font font = workbook.createFont();
            font.setFontName("黑体");
            font.setFontHeightInPoints((short) 24);
            font.setColor((short) 10);
            cellStyle.setFont(font);
    
            //设置文字居中显示
            cellStyle.setAlignment(HorizontalAlignment.CENTER);
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
    
            return cellStyle;
        }
    
    
        /**
         * 设置表头单元格样式
         * @param workbook 工作薄对象
         * @return 单元格样式对象
         */
        private static CellStyle getHeaderCellStyle(Workbook workbook) {
            CellStyle cellStyle = workbook.createCellStyle();
    
            //设置字体
            Font font = workbook.createFont();
            font.setFontName("宋体");
            font.setFontHeightInPoints((short) 20);
            font.setBold(true);
            cellStyle.setFont(font);
    
            //设置文字居中显示
            cellStyle.setAlignment(HorizontalAlignment.CENTER);
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
    
            //设置单元格的边框
            setCellBorderStyle(BorderStyle.THIN, cellStyle);
    
            return cellStyle;
        }
    
        /**
         * 设置表体单元格样式
         * @param workbook 工作薄对象
         * @return 单元格样式对象
         */
        private static CellStyle getBodyCellStyle(Workbook workbook) {
            CellStyle cellStyle = workbook.createCellStyle();
    
            //设置字体
            Font font = workbook.createFont();
            font.setFontName("宋体");
            font.setFontHeightInPoints((short) 16);
            cellStyle.setFont(font);
    
            //设置文字居中显示
            cellStyle.setAlignment(HorizontalAlignment.CENTER);
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
    
            //设置单元格的边框
            setCellBorderStyle(BorderStyle.THIN, cellStyle);
    
            return cellStyle;
        }
    
        /**
         * 获取单元格的值的字符串
         * @param cell 单元格对象
         * @return cell单元格的值的字符串
         */
        private static String getStringValue(Cell cell) {
            if (cell == null) {
                return null;
            }
            CellType cellType = cell.getCellType();
            switch (cellType) {
                case STRING:
                    return cell.getStringCellValue();
                case NUMERIC:
                    double value = cell.getNumericCellValue();
                    return String.valueOf(Math.round(value));
                case BOOLEAN:
                    return String.valueOf(cell.getBooleanCellValue());
                default:
                    return null;
            }
        }
    
    }
    
    

    ExcelApplication主启动类程序如下所示:

    package com.office.excel;
    
    import com.office.excel.model.User;
    import com.office.excel.util.ExcelUtil;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    /**
     * Java使用POI生成和读取Excel文件主程序
     */
    @SpringBootApplication
    public class ExcelApplication {
    
        //Excel文件路径
        private static String excelFile = "E://User.xls";
    
        public static void main(String[] args) throws IOException {
            SpringApplication.run(ExcelApplication.class, args);
    
            /**
             * 自动生成Excel文件
             */
            ExcelUtil.writeExcel(excelFile, getExcelData());
    
            /**
             * 自动读取Excel文件
             */
            List<User> users = ExcelUtil.readExcel(excelFile);
    
            /**
             * 查看批量导入的用户数据
             */
            printList(users);
        }
    
        /**
         * 创建写入到Excel中的数据
         * @return 用户数据集合
         */
        private static List<User> getExcelData() {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            List<User> users = new ArrayList<>();
            for(int i = 1; i <= 10; i++) {
                User user = new User();
                user.setId((long) i);
                user.setName("user" + i);
                user.setSex((i % 2) == 0);
                user.setAge(i);
                user.setBirthday(sdf.format(new Date()));
                users.add(user);
            }
            return users;
        }
    
        /**
         * 打印用户数据
         * @param users 要打印的用户数据集合
         */
        private static void printList(List<User> users) {
            if(users == null) {
                System.out.println("用户数据为空");
                return;
            }
            for(User user : users) {
                System.out.println(user.toString());
            }
        }
    
    }
    
    

    4 测试

    直接运行ExcelApplication主程序,即可在E盘根目录下生成一个名为User.xlsx的Excel文件,打开后即为第2节中的目标效果,并且IDEA控制台上也打印出了从自动生成的User.xlsx文档中批量导入的用户数据(如下图):
    在这里插入图片描述
    至此,Java使用POI自动生成Excel文档并且从Excel文档批量导入数据的操作都已实现。

    如果觉得本文对您有帮助,请关注博主的微信公众号,会经常分享一些Java和大数据方面的技术案例!
    在这里插入图片描述

    展开全文
  • POI读写excel简单教程

    2020-06-10 22:48:28
    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 基本功能 HSSF - 提供读写Microsoft Excel格式档案的功能。 XSSF - 提供读写Microsoft Excel ...
  • 很多时候我们只需要一份文件里的部分信息,当文件量大的时候,一份一份的去找就很费时间了,java中使用poi可以实现对word、excel、ppt等文件的读取,进而对文件内容进行操作 一、环境 eclipse(Version: 2019-03 ...
  • java中poi读写excel封装工具类(兼容office2003和2007等版本),绝对可用的例子!
  • java poi 读写Excel jar包

    2020-07-21 09:59:24
    Java 操作Excel poi读写excel,所需要的jar包 https://blog.csdn.net/u014646662/article/details/83217382
  • POI读写EXCEL文件

    2018-08-15 23:35:52
    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 基本功能 结构: HSSF - 提供读写Microsoft Excel格式档案的功能。 XSSF - 提供读写Microsoft...
  • Java通过POI读写Excel文件   在企业项目中经常要用Java来读写Excel或者Word文档,Excel是微软的office产品中的一个重要产品,并且也是非常流行的产品。现在走 在大街上的10个人可能都不知道java是什么东西,...
  • NULL 博文链接:https://chong0660.iteye.com/blog/1923735
  • poi读写excel和word

    2011-10-21 15:35:32
    如果在项目中想把excel数据导入到数据库中或者将数据库中的数据导出为excel,POI是个不错的选择。Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能。 ...
  • 版权声明:本文为HaiyuKing...如果模板文件是docx文件的话,请阅读下一篇文章《PoiDocxDemo【Android将表单数据生成Word文档的方案之二(基于Poi4.0.0),目前只能java生成】》 注意: POI 4.0.0 is the firs...
  • poi读写excel 2007

    2016-03-06 18:51:35
    //office2007工作区 XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream("D:/temp/test_poi.xlsx")); //获得该工作区的第一个sheet XSSFSheet sheet = wb.getSheetAt(0); //总共有多少行,从0开始 int ...
  • 待完成。。。
  • Office文档是以二进制格式存储的,对于它的读写不能像普通文本一样通过File来操作,如果以二进制格式读取到内存中,我们也是不能够正确解析其中的内容的,在Windows开发中、或者使用QT开发中,我们可以使用库提供的...
  • 使用poi读写Excel

    2014-10-29 03:35:30
    对于一个程序员来说,文件操作是经常遇到的,尤其是对Excel文件的操作。...POI是apache的类库,主要是为java开发人员提供对Office文件(word、ppt、Excel)处理的支持。我这里主要给出几个例子来说明演示一下。
  • 使用poi读写excel

    2019-12-26 15:48:02
    首先了解以下excel文件怎么和poi中的组件对应起来的。 一个Excel文件对应于一个Workbook对象 一个Workbook可以有多个Sheet对象 一个Sheet对象由多个Row对象组成 一个Row对象是由多个Cell对象组成 基于以上几条,...
  • 首先建立maven工程在&lt;dependencies&gt;&...org.apache.poi&lt;/groupId&gt; &lt;artifactId&gt;poi&lt;/artifactId&gt; &lt;version&gt;3.17&lt
1 2 3 4 5 ... 20
收藏数 2,941
精华内容 1,176
关键字:

poi读写office