POI操作word方法大全示例总结
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
使用场景
近段时间,由我开发的公司其中的一个管理模块,有个需求就是生成月度报表,其中涉及到很多报表的整合 到最后都要生成到一个word上,由于数据量的不定性,所以不能使用模板去生成,就需要按照需求手动生成,所以运用了poi,也进行了系统的复习,涉及到了很多poi的基本操作,也遇到了很多坑,所以总结一下,方便之后查缺补漏
提示:以下是本篇文章正文内容,下面案例可供参考
一、poi是什么?
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
二、使用示例
1.代码示例
里面很多涉及到公司到业务的定制可以忽略,但是api的使用还是比较全的:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.常用api操作
//创建一个word文档
XWPFDocument xwpfDocument = new XWPFDocument();
//创建段落标题
XWPFParagraph titlesparagraph1 = xwpfDocument.createParagraph();
XWPFRun run = titlesparagraph1.createRun();
//设置文字
run.setText("1 "+ data.getString(formatMonth)+"月工作情况");
//文字大小
run.setFontSize(18);
//加粗
run.setBold(true);
3.表格相关
代码如下(示例):
//设置单元格样式 本人对生成表格样式的集中方法
public XWPFTable setWordStyle(XWPFTable table,int col){
//给表格加边框
CTTblBorders borders = table.getCTTbl().getTblPr().addNewTblBorders();
CTBorder lBorder = borders.addNewLeft();
//双实线
lBorder.setVal(STBorder.Enum.forString("double"));
lBorder.setSz(new BigInteger("1"));
lBorder.setColor("000000");
CTBorder rBorder = borders.addNewRight();
rBorder.setVal(STBorder.Enum.forString("double"));
rBorder.setSz(new BigInteger("1"));
rBorder.setColor("000000");
CTBorder tBorder = borders.addNewTop();
tBorder.setVal(STBorder.Enum.forString("double"));
tBorder.setSz(new BigInteger("1"));
tBorder.setColor("000000");
CTBorder bBorder = borders.addNewBottom();
bBorder.setVal(STBorder.Enum.forString("double"));
bBorder.setSz(new BigInteger("1"));
bBorder.setColor("000000");
//获取到表格属性
CTTblPr tablePr = table.getCTTbl().addNewTblPr();
// table.se(TableRowAlign.CENTER);
//获取到表格样式宽度
CTTblWidth width = tablePr.addNewTblW();
//设置宽度
width.setW(BigInteger.valueOf(9000));
//设置表格宽度为非自动
width.setType(STTblWidth.DXA);
//获取到表格的所有行数
List<XWPFTableRow> rows = table.getRows();
for (int i = 0; i < rows.size(); i++) {
//表格中行对象
XWPFTableRow row = rows.get(i);
//获取到行属性
CTTrPr ctTrPr = row.getCtRow().addNewTrPr();
//行高属性
CTHeight ctHeight = ctTrPr.addNewTrHeight();
//设置行高
if (i==0){
ctHeight.setVal(new BigInteger("400"));
}else {
ctHeight.setVal(new BigInteger("700"));
}
for (int j=0;j<col;j++){
//获得每个单元格的属性
CTTcPr ctTcPr = row.getCell(j).getCTTc().addNewTcPr();
//获得每个单元格的宽度属性
CTTblWidth ctTblWidth = ctTcPr.addNewTcW();
//设置宽度
switch (String.valueOf(col)){
case "2":
if (j==0){
//设置表格中单元格宽度
ctTblWidth.setW(BigInteger.valueOf(1000));
}else{
ctTblWidth.setW(BigInteger.valueOf(8000));
}
break;
case "4":
if (j==0){
ctTblWidth.setW(BigInteger.valueOf(1000));
}else if (j==1||j==2){
ctTblWidth.setW(BigInteger.valueOf(2000));
}else if (j==3){
ctTblWidth.setW(BigInteger.valueOf(4000));
}
break;
case "5":
if (j==0||j==2){
ctTblWidth.setW(BigInteger.valueOf(1000));
}else if (j==1||j==3){
ctTblWidth.setW(BigInteger.valueOf(2000));
}else if (j==4){
ctTblWidth.setW(BigInteger.valueOf(3000));
}
break;
}
ctTblWidth.setType(STTblWidth.DXA);
//表格行内容垂直居中:
CTVerticalJc va = ctTcPr.addNewVAlign();
va.setVal(STVerticalJc.CENTER);
//表格行水平居中
row.getCell(j).getCTTc().getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
//给单元格添加颜色
CTShd ctshd = ctTcPr.addNewShd();
ctshd.setColor("auto");
ctshd.setVal(STShd.CLEAR);
if (i==0){
//只给第一行添加颜色
//ctshd.setFill("A7BFDE");
}
}
}
return table;
}
创建表格
XWPFTable table =null;
if (dataList.size()>0) {
//生成个表格
table = xwpfDocument.createTable(dataList.size() + 1, col);
}else {
//如果数量小于0 说明没数据 那就建一个2行的表格
table = xwpfDocument.createTable(2, col);
//1.1.1 往表格添加数据
table.getRow(0).getCell(0).setText("序号");
table.getRow(0).getCell(1).setText("项目名称");
table.getRow(0).getCell(2).setText("负责人");
table.getRow(0).getCell(3).setText("项目状况");
}
3.插入页眉页脚
插入页眉
//创建页眉
public static XWPFDocument createHeader (XWPFDocument doc) throws Exception {
CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr();
XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy( doc, sectPr );
XWPFHeader header = headerFooterPolicy.createHeader(headerFooterPolicy.DEFAULT);
// XWPFHeader header1 = headerFooterPolicy.createHeader(headerFooterPolicy.EVEN);
// XWPFHeader header2 = headerFooterPolicy.createHeader(headerFooterPolicy.DEFAULT);
XWPFParagraph paragraph = header.createParagraph();
//靠左
paragraph.setAlignment( ParagraphAlignment.LEFT );
//实线
paragraph.setBorderBottom( Borders.THICK );
XWPFRun run = paragraph.createRun();
String imgFile = "C:\\TEST\\111.jpg";
File file = new File( imgFile );
InputStream is = new FileInputStream( file );
//添加页眉图片
XWPFPicture picture = run.addPicture( is, XWPFDocument.PICTURE_TYPE_JPEG, imgFile, Units.toEMU( 140 ), Units.toEMU( 17 ) );
String blipID = "";
for( XWPFPictureData picturedata : header.getAllPackagePictures() ) { // 这段必须有,不然打开的logo图片不显示
blipID = header.getRelationId( picturedata );
picture.getCTPicture().getBlipFill().getBlip().setEmbed( blipID );
}
is.close();
run.addBreak();
//测试路径
return doc;
}
插入页脚
//生成页脚
public void createFooter(XWPFDocument doc){
/*
* 生成页脚段落
* 给段落设置宽度为占满一行
* */
CTSectPr sectPr=doc.getDocument().getBody().addNewSectPr();
XWPFHeaderFooterPolicy headerFooterPolicy=new XWPFHeaderFooterPolicy(doc,sectPr);
try {
XWPFFooter footer=headerFooterPolicy.createFooter(STHdrFtr.DEFAULT);
XWPFParagraph paragraph = footer.getParagraphArray(0);
paragraph.setAlignment(ParagraphAlignment.LEFT);
paragraph.setVerticalAlignment(TextAlignment.CENTER);
paragraph.setBorderTop(Borders.THICK);
CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab();
tabStop.setVal(STTabJc.RIGHT);
int twipsPerInch = 1440;
tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch));
/*
* 给段落创建元素
* 设置元素字面为公司地址+公司电话
* */
XWPFRun run = paragraph.createRun();
setXWPFRunStyle(run,"宋体",11);
run.addTab();
String s=run.getFontFamily();
/*
* 生成页码
* 页码右对齐
* */
run = paragraph.createRun();
run.setText("第");
setXWPFRunStyle(run,"宋体",11);
run = paragraph.createRun();
CTFldChar fldChar = run.getCTR().addNewFldChar();
// fldChar.set
fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
setXWPFRunStyle(run,"宋体",11);
run = paragraph.createRun();
CTText ctText = run.getCTR().addNewInstrText();
ctText.setStringValue("PAGE \\* MERGEFORMAT");
ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
setXWPFRunStyle(run,"宋体",11);
fldChar = run.getCTR().addNewFldChar();
fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
run = paragraph.createRun();
run.setText("页/共");
setXWPFRunStyle(run,"宋体",11);
run = paragraph.createRun();
fldChar = run.getCTR().addNewFldChar();
fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
run = paragraph.createRun();
ctText = run.getCTR().addNewInstrText();
ctText.setStringValue("NUMPAGES \\* MERGEFORMAT ");
ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
setXWPFRunStyle(run,"宋体",11);
fldChar = run.getCTR().addNewFldChar();
fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
run = paragraph.createRun();
run.setText("页");
setXWPFRunStyle(run,"宋体",11);
} catch (IOException e) {
e.printStackTrace();
}
}
设置字体
private void setXWPFRunStyle(XWPFRun r1,String font,int fontSize) {
r1.setFontSize(fontSize);
//获取到样式属性(三元运算符)
CTRPr rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
//设置字体
fonts.setAscii(font);
fonts.setEastAsia(font);
fonts.setHAnsi(font);
}
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅介绍了poi的使用及一些常用的api,而poi提供了大量能使我们快速便捷地处理word和excel的方法,记录下 方便以后回顾 。