使用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);