使用JAVA POI类生成WORD/EXCEL实战

使用JAVA POI类生成WORD实战(一)


首先需要引入POI类的依赖
下载地址:
    https://archive.apache.org/dist/poi/release/bin/
需要的jar包(我用的是3.10final)
    Poi-3.10-Final.jar (用于xls)
    Poi-ooxml-3.10-Final.jar (用于xlsx)
    Poi-ooxml-schemas-3.10.jar
    Xmlbeans-2.30.jar
    dom4j-1.6.1.jar
    poi-scratchpad-3.10-FINAL-20140208.jar(用于word,ppt)

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>

jar包或者依赖引入其中一个即可

引入后具体实战
    首先先写个until类来向WORD中写入内容
  

public XWPFDocument createXWPFDocument() {
        XWPFDocument doc = new XWPFDocument();
        XWPFParagraph headerInputParagraph = document.createParagraph();//生成全新的一行
        headerInputParagraph.setAlignment(ParagraphAlignment.CENTER);//设置对齐方式
        XWPFRun titleFun01 = headerInputParagraph.createRun();//创建要写的文本
        titleFun01.setText("*" + title + "委员会");//文本内容
        titleFun01.setColor("000000");//设置颜色
        titleFun01.setFontSize(22);    //字体大小
        titleFun01.setFontFamily("方正小标宋_GBK");//设置字体
        return doc;
        
    }

   XWPFRun的具体方法实现:
       https://www.cnblogs.com/unruly/archive/2017/09/06/7483858.html

 上面就是向WORD中写入了一行内容

 然后需要生成一个WORD,这里使用IO流去生成
     1、首先将上面的until类生成一个对象并生成一个document,然后继续参照上面写入内容一样向创建的document中写入内容
        

ExportWord ew = new ExportWord();//类名
XWPFDocument document = ew.createXWPFDocument();//生成document


    2、将写好的word(document对象)通过IO流输出出去
         

try{
      OutputStream os = new FileOutputStream(new File(filename));
      //此处的filename即为一个具体的路径名称,即:E:\create_table.doc
      document.write(os);//写入内容
      os.close();
}
catch(Exception e){
      e.printStackTrace();
}


这样就是完整创建一个WORD并向其中写入内容的操作。


使用JAVA POI类生成WORD实战(二)


    如何将word模板中的表格引入新的word中
        首先提取模板中的所有表格
            

//此处的sourcePath是你模板的路径
XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(sourcePath));
List<XWPFTable> allTable = document.getTables();//获取所有的表格
//此时注意,若是想在新word中引入表格,需要先新建一个空表格,然后再将模板中的表格复制进去
XWPFDocument doc = new XWPFDocument();//这是你要最终获取的word
doc.createTable();
doc.setTable(0,allTable.get(0));//此处的0是指新模板中的第一个表格的意思


    如何将表格放到下一页去展示
        在上面的内容最后,即确定内容已经写完,需要将表格插入到下一页了
        doc.createParagraph().createRun().addBreak(BreakType.PAGE);
        即可分页
如何使Word中的页横向还是纵向展示
    CTSectPr sectPr = XWPFDocument.getDocument.getBody.addNewSectPr();
    CTPageSz pgSz = sectPr.addNewPgSz();
    通过pgSz设置宽度/高度 和纸张方向
    //设置横板
    pgSz.setW(BigInteger.valueOf(15840));
    pgSz.setH(BigInteger.valueOf(11907));
    pgSz.setOrient(STPageOrientation.LANDSCAPE);
    //设置竖版
    pgSz.setH(BigInteger.valueOf(15840));
    pgSz.setW(BigInteger.valueOf(11907));
    pgSz.setOrient(STPageOrientation.PORTRAIT);

使用JAVA POI类生成WORD实战(三)


    如何使用word去画出一个表格
        

XWPFDocument doc = new XWPFDocument();
XWPFTable table = doc.createTable(5,23);//这里是5*23的表格

//合并行(第一行与第二行合并)
for (int rowIndex = 0; rowIndex <= 1; rowIndex++) {
   XWPFTableCell cell = table.getRow(rowIndex).getCell(0);
   if ( rowIndex == 0 ) {
       // The first merged cell is set with RESTART merge value
       cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
   } else {
       // Cells which join (merge) the first one, are set with CONTINUE
       cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
   }
}

//此处也是合并行,是将第8列到第23列的3-5行合并
for(int i = 7;i<23;i++){
   for(int j = 2;j<=4;j++){
     XWPFTableCell cell = table.getRow(j).getCell(i);
     if ( j == 2 ) {
       // The first merged cell is set with RESTART merge value
       cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
     } else {
       // Cells which join (merge) the first one, are set with CONTINUE
       cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
     }
    }
}
//此处是合并列,即某一行的第2列到第7列合并
for (int i = 1; i <= 6; i++) {
  //对单元格进行合并的时候,要标志单元格是否为起点,或者是否为继续合并
  if (i == 1){
   //这是起点                     
   tableName12.get(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
  }else{
   //继续合并             
   tableName12.get(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
  }
}

        后续就与其他的一致即可


2、使用multipartfile 类本身自带的transferto 方法,可以将file上传到指定的路径下


具体源码及解释路径
https://blog.csdn.net/lezeqe/article/details/108937647

使用JAVA POI类生成Excel实战
    1、直接生成Excel

        //创建工作薄
        XSSFWorkbook wb = new XSSFWorkbook(fi);
        XSSFSheet sheet = wb.getSheetAt(0);
        if(sheet == null){
            sheet = wb.createSheet("巡视列表");
        }
        //创建行Row   此处注意,若是没有该行,则创建create,若是已有该行,则获取
        //创建
        Row row = sheet.createRow(行号(从零开始));
        //获取
        Row row = sheet.getRow(行号(从零开始));
        //创建单元格,也就是在该行的基础上创建列,原理同创建行一致,有就获取
        //创建
        row.createCell(列号(从零开始));
        Cell cell = row.getCell(列号);
        //获取
        Cell cell = row.getCell(列号);

        //传入值
        cell.setCellValue("内容");


        后续与word一致,输出即可

    2、导入Excel模板并操作

         String sourcePath = ExportDataUtil.CLASSPATH + "/ledgerTemplate/"+"线索表二.xlsx";//这里便是excel在电脑中的具体路径
         File file = new File(sourcePath);//获取该路径下的文件
         FileInputSteam fi = new FileInputSteam(file);//获取改文件的输入流
         XSSFWorkbook wb = new XSSFWorkbook(fi);
         XSSFSheet sheet = wb.getSheetAt(0);
         if(sheet == null){
            sheet = wb.createSheet("巡视列表");
         }


         后续就与生产excel同理,对应的位置输入值即可,同时也要注意,如果模板中行列已经被操作,那么就要获取,如果没有,就要创建

    3、合并行列

        CellRangeAddress region3 = new CellRangeAddress(StartRow,EndRow,StartCell,EndCell );//这四个值是对应的起始行、终止行、起始列、终止列
        sheet.addMergedRegion(region3);

 

上一篇:2021年底跨平台技术比较和选型指南(也许是最全的)


下一篇:java poi之XWPFDocument读取word内容并创建新的word