zoukankan      html  css  js  c++  java
  • java使用POI导出word文档,包含图片,表格,文本

     以下是导出word文档包含文本、图片、表格

    首先声明一些基本概念:

    XWPFDocument代表一个docx文档,其可以用来读docx文档,也可以用来写docx文档
    XWPFParagraph代表文档、表格、标题等种的段落,由多个XWPFRun组成
    XWPFRun代表具有同样风格的一段文本
    XWPFTable代表一个表格
    XWPFTableRow代表表格的一行
    XWPFTableCell代表表格的一个单元格
    XWPFPicture 代表图片

    下面是导出的word文档

     

     对象的部分说明:

    XWPFDocument对象可以包含多个段落,表格,图片
    XWPFParagraph对象代表文档、表格、标题等种的段落,由多个XWPFRun组成

    1.createRun(),在段落里创建一个XWPFRun文本

    2..setAlignment(ParagraphAlignment.CENTER)设置段落内容水平居中

    XWPFRun代表具有同样风格的一段文本。注意:直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun。

    以上代码使用到的XWPFRun方法是:

    1.setText(String 内容),设置文本的内容

    2.addBreak(),换行

    3.setFontFamily(string 字体类型),设置字体类型,如宋体、微软雅黑、黑体等

    4.addPicture(is, XWPFDocument.PICTURE_TYPE_JPEG, filePath+"1.jpg", Units.toEMU(120), Units.toEMU(20))。

    第1个参数为文件输入流,第二个参数为图片类型如jpg类型,第三个参数为图片路径,第四个参数为图片宽度,第五个参数为图片高度。

    5..setBold(true)设置字体是否加粗,false表示不加粗

    6..setFontSize(12)//设置字体大小

    XWPFTable代表一个表格
    XWPFTableRow代表表格的一行
    XWPFTableCell代表表格的一个单元格,每一个单元格都包含一个段落

    1.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER)设置单元格内容垂直居中
    XWPFPicture 代表图片

     以下是导出文档的代码:(注意:运行以下代码时,要在D盘放一张.jpg图片,图片名为1.jpg)

      1  2 
      3 import java.io.File;
      4 import java.io.FileInputStream;
      5 import java.io.FileNotFoundException;
      6 import java.io.FileOutputStream;
      7 import java.io.IOException;
      8 import java.io.OutputStream;
      9 import java.io.UnsupportedEncodingException;
     10 import java.math.BigInteger;
     11 import java.util.ArrayList;
     12 import java.util.List;
     13 
     14 import org.apache.poi.util.Units;
     15 import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
     16 import org.apache.poi.xwpf.usermodel.XWPFDocument;
     17 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
     18 import org.apache.poi.xwpf.usermodel.XWPFRun;
     19 import org.apache.poi.xwpf.usermodel.XWPFTable;
     20 import org.apache.poi.xwpf.usermodel.XWPFTableCell;
     21 import org.apache.poi.xwpf.usermodel.XWPFTableRow;
     22 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;
     23 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
     24 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing;
     25 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
     26 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;
     27 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
     28 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
     29 import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
     30 import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
     31 import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
     32 
     33 public class DownloadWordDemo {
     34     /**
     35      * 跨列合并
     36      * @param table
     37      * @param row    所合并的行
     38      * @param fromCell    起始列
     39      * @param toCell    终止列
     40      * @Description
     41      */
     42     public void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {
     43         for(int cellIndex = fromCell; cellIndex <= toCell; cellIndex++ ) {
     44             XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
     45             if(cellIndex == fromCell) {
     46                 cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
     47             } else {
     48                 cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
     49             }
     50         }
     51     }
     52     /**
     53      * 跨行合并
     54      * @param table
     55      * @param col    合并的列
     56      * @param fromRow    起始行
     57      * @param toRow    终止行
     58      * @Description
     59      */
     60     public void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
     61         for(int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
     62             XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
     63             //第一个合并单元格用重启合并值设置
     64             if(rowIndex == fromRow) {
     65                 cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
     66             } else {
     67                 //合并第一个单元格的单元被设置为“继续”
     68                 cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
     69             }
     70         }
     71     }
     72     /**
     73      * @Description: 设置表格总宽度与水平对齐方式
     74      */
     75     public void setTableWidthAndHAlign(XWPFTable table, String width,
     76         STJc.Enum enumValue) {
     77       CTTblPr tblPr = getTableCTTblPr(table);
     78       // 表格宽度
     79       CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();
     80       if (enumValue != null) {
     81         CTJc cTJc = tblPr.addNewJc();
     82         cTJc.setVal(enumValue);
     83       }
     84       // 设置宽度
     85       tblWidth.setW(new BigInteger(width));
     86       tblWidth.setType(STTblWidth.DXA);
     87     }
     88     /**
     89      * @Description: 得到Table的CTTblPr,不存在则新建
     90      */
     91     public CTTblPr getTableCTTblPr(XWPFTable table) {
     92       CTTbl ttbl = table.getCTTbl();
     93       // 表格属性
     94       CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();
     95       return tblPr;
     96     }
     97     public void downloadWord() throws IOException {
     98         String filePath = "D:\";100         //生成一个文档
    101         XWPFDocument document = new XWPFDocument();
    102 
    103          
    104         XWPFParagraph para;  //代表文档、表格、标题等种的段落,由多个XWPFRun组成
    105         XWPFRun run;  //代表具有同样风格的一段文本
    106         XWPFTableRow row;//代表表格的一行
    107         XWPFTableCell cell;//代表表格的一个单元格
    108         CTTcPr cellPr; //单元格属性
    109          
    110         //设置提案封面内容
    111         XWPFParagraph proCoverParagraph = document.createParagraph();    //新建一个标题段落对象(就是一段文字)
    112         proCoverParagraph.setAlignment(ParagraphAlignment.LEFT);//样式居中
    113         XWPFRun coverRun0 = proCoverParagraph.createRun();    //创建文本对象
    114         coverRun0.setBold(true); //加粗
    115         coverRun0.setFontSize(12);    //字体大小
    116         coverRun0.setText(String.valueOf("附件:
    "));
    117         
    118         
    119         XWPFParagraph proCoverParagraph1 = document.createParagraph();    //新建一个标题段落对象(就是一段文字)
    120         proCoverParagraph1.setAlignment(ParagraphAlignment.CENTER);//样式左对齐
    121         XWPFRun coverRun1 = proCoverParagraph1.createRun();    //创建文本对象
    122         coverRun1.setBold(true); //加粗
    123         coverRun1.setFontSize(41);    //字体大小
    124         coverRun1.setText(String.valueOf("不如意事常八九
    可与人言无二三
    
    提
    
    案
    
    表
    
    "));
    125             
    126         XWPFParagraph proCoverParagraph2 = document.createParagraph();    //新建一个标题段落对象(就是一段文字)
    127         proCoverParagraph2.setAlignment(ParagraphAlignment.LEFT);//样式居中
    128         XWPFRun coverRun2 = proCoverParagraph2.createRun();    //创建文本对象
    129         coverRun2.setBold(true); //加粗
    130         coverRun2.setFontSize(16);    //字体大小
    131         coverRun2.setText(String.valueOf("
    编号:"+"2020001"+"
    填表时间:"+"2020"+"年"+"10"+"月"+"20"+"日"));//给文本赋值
    132         
    133         
    134         //创建表格
    135         XWPFTable table  = document.createTable(10,9);  //10行9格
    136         table.setCellMargins(3, 5, 3, 5);//在表级别设置单元格边距
    137         
    138         //设置表格总宽度,字体居中
    139         ct.setTableWidthAndHAlign(table, "10000", STJc.CENTER);
    140         
    141         //固定表格宽度,关闭自动伸缩
    142         CTTblPr tblPr = table.getCTTbl().getTblPr();
    143         tblPr.getTblW().setType(STTblWidth.DXA);
    144 
    145         
    146         //设置表格样式
    147         List<XWPFTableRow> rowList = table.getRows();
    148         //扫描行
    149         for(int i = 0; i < rowList.size(); i++) {
    150             XWPFTableRow infoTableRow = rowList.get(i);
    151             List<XWPFTableCell> cellList = infoTableRow.getTableCells();
    152             //扫描列
    153             for(int j = 0; j < cellList.size(); j++) {
    154                 XWPFParagraph cellParagraph = cellList.get(j).getParagraphArray(0);
    155                 cellParagraph.setAlignment(ParagraphAlignment.CENTER);//设置表格内容水平居中
    156                 XWPFRun cellParagraphRun = cellParagraph.createRun();//在段落创建一个文本
    157                 cellParagraphRun.setFontSize(12);//设置字体大小
    158                 cellParagraphRun.setBold(true);//加粗
    159             }
    160         }
    161         
    162         XWPFTableCell cell1 = null;
    163         cell1 = table.getRow(2).getCell(0);
    164         cell1.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); //设置第3~7行第1列单元格的内容垂直居中
    165         
    166         
    167         //设置表格每列宽度
    168         for(int i=0;i<10;i++) {
    169             row = table.getRow(i);
    170             //设置每行的格式(多少格)
    171             for(int j=0;j<9;j++) {
    172                 cell = row.getCell(j);//获取行中第j块单元格
    173                 
    174                 //设置单元格列宽
    175                 CTTcPr tcpr = cell.getCTTc().addNewTcPr();
    176                 CTTblWidth cellw = tcpr.addNewTcW();
    177                 if(j==0) {
    178                     cellw.setW(BigInteger.valueOf(1900));
    179                 }
    180                 if(j==1||j==5) {
    181                     cellw.setW(BigInteger.valueOf(550));
    182                 }
    183                 if(j==2||j==4||j==6||j==8) {
    184                     cellw.setW(BigInteger.valueOf(1280));
    185                 }
    186                 if(j==3||j==7) {
    187                     cellw.setW(BigInteger.valueOf(940));
    188                 }
    189             }
    190         }
    191         
    192         //合并表格
    193         mergeCellsHorizontal(table,0,1,8);//合并第一行,第2~9列
    194         mergeCellsHorizontal(table,2,1,8);
    195         mergeCellsHorizontal(table,3,1,8);
    196         mergeCellsHorizontal(table,4,1,8);
    197         mergeCellsHorizontal(table,5,1,8);
    198         mergeCellsHorizontal(table,6,1,8);
    199         mergeCellsVertically(table,0,2,6);//合并第1列,第3~7行
    200         mergeCellsVertically(table,1,2,6);//合并第2列,3~7行
    201         
    202         //对赋值表格
    203         List<XWPFTableRow> rowList1 = table.getRows();
    204         List<XWPFTableCell> cellList = new ArrayList<XWPFTableCell>();
    205         XWPFParagraph cellParagraph =  null;//存一行的列
    206         XWPFRun cellParagraphRun = null;//单元格
    207         //第1行第1列
    208         cellList = rowList1.get(0).getTableCells();
    209         cellParagraph = cellList.get(0).getParagraphArray(0);
    210         cellParagraphRun = cellParagraph.getRuns().get(0);
    211         cellParagraphRun.setText(String.valueOf("案名"));
    212         cellParagraph = cellList.get(1).getParagraphArray(0);//第2格的段落
    213         //第一行第2列
    214         cellParagraphRun = cellParagraph.getRuns().get(0);
    215         cellParagraphRun.setText(String.valueOf("案名是习惯过了头地方案名是习惯过了头"));   
    216         
    217         //第3行第1列
    218         cellList = rowList1.get(2).getTableCells();
    219         cellParagraph = cellList.get(0).getParagraphArray(0);//第2格的段落
    220         cellParagraphRun = cellParagraph.getRuns().get(0);
    221         cellParagraphRun.setText(String.valueOf("习惯过了头")); 
    222         
    223         //第3行第2列
    224         cellParagraph = cellList.get(1).getParagraphArray(0);//第2格的段落
    225         cellParagraph.setAlignment(ParagraphAlignment.LEFT);//设置左对齐
    226         cellParagraphRun = cellParagraph.getRuns().get(0);
    227         cellParagraphRun.setText(String.valueOf("习惯过了头:"));
    228         
    229         //添加图片
    230         try (FileInputStream is = new FileInputStream
    231                 (filePath+"1.jpg")) {
    232             cellParagraphRun.addPicture(is, XWPFDocument.PICTURE_TYPE_JPEG, 
    233                     filePath+"1.jpg", 
    234                     Units.toEMU(120), Units.toEMU(20)); // 200x200 pixels
    235         }catch (Exception e){
    236             e.printStackTrace();
    237         }
    238         cellParagraphRun.addBreak();//换行
    239         cellParagraphRun.addBreak();
    240         XWPFRun cellParagraphRun1 = cellParagraph.createRun();
    241         cellParagraphRun1.setFontFamily("微软雅黑");//设置字体
    242         cellParagraphRun1.setText("c15宿舍要消毒");
    243         
    244         
    245         //导出word文档
    246         String fileName = "D:/poi导出word文档.docx";
    247         File outputFolder = new File("D:/");
    248         if (!outputFolder.exists()) {
    249             outputFolder.mkdir();
    250         }
    251         String encode = System.getProperty("file.encoding"); 
    252         try {
    253             fileName = new String(fileName.getBytes("UTF-8"),encode);
    254         } catch (UnsupportedEncodingException e1) {
    255             e1.printStackTrace();
    256         }
    257         try {
    258             FileOutputStream fout = new FileOutputStream(fileName);
    259             document.write(fout);
    260             fout.close();
    261         } catch (FileNotFoundException e) {
    262             e.printStackTrace();
    263         } catch (IOException e) {
    264             e.printStackTrace();
    265         }
    266         
    267     }
    268     public static void main(String[] args) throws IOException {
    269         DownloadWordDemo dw = new DownloadWordDemo();
    270         dw.downloadWord();
    271 
    272     }
    273 
    274 }

     以上代码是写在maven项目里的,需要导入jar包,pom.xml里的代码要加上以下内容:

     1  <dependencies>    
     2     <dependency>
     3        <groupId>org.apache.poi</groupId>
     4        <artifactId>poi-scratchpad</artifactId>
     5        <version>3.17</version>
     6     </dependency>
     7     
     8     <dependency>
     9         <groupId>org.apache.poi</groupId>
    10         <artifactId>poi-ooxml</artifactId>
    11         <version>3.17</version>
    12     </dependency>
    13     
    14     <dependency>
    15         <groupId>org.apache.poi</groupId>
    16         <artifactId>poi</artifactId>
    17         <version>3.17</version>
    18     </dependency>
    19 </dependencies>

     POI的官网,里面可以看到官方的API文档:

    http://poi.apache.org/apidocs/index.html

    文章里如果有错误的地方还望朋友指出,谢谢
  • 相关阅读:
    Win7下IE 8内存保护可能导致ActiveX无法安装的问题及其解决方法
    为Windows Server 2000开发和部署ASP.NET 3.5的应用程序
    MOSS 2010:如何为列表设计Infopath表单用于编辑和显示
    Windows Live is designed for you, but maybe not for your browser
    Meet the new WSS SharePoint Foundation 2010
    MOSS 2010: Visual Studio 2010开发体验(3)——调试代码
    MOSS 2010:Visual Studio 2010开发体验(10)——列表开发之内容类型
    MOSS 2010:谁动了我的“共享服务”
    MOSS 2010:通过SharePoint Designer定制列表项的条件格式
    如何访问嵌套母版页中的控件
  • 原文地址:https://www.cnblogs.com/dqccc/p/13836720.html
Copyright © 2011-2022 走看看