public class DnaDocPoiUtil {
public XWPFDocument document;
public DnaDocPoiUtil(String inPath) {
try {
document = new XWPFDocument(new FileInputStream(new File(inPath)));
}catch (Exception r){
r.printStackTrace();
}
}
public DnaDocPoiUtil(InputStream inputStream) {
try {
document = new XWPFDocument(inputStream);
}catch (Exception r){
r.printStackTrace();
}
}
public XWPFDocument getDocument() {
return document;
}
public List<XWPFParagraph> getParagraphs() {
return document.getParagraphs();
}
public XWPFParagraph getParagraphArray(int pos){
return document.getParagraphArray(pos);
}
public XWPFParagraph insertNewParagraph(int pos){
XWPFParagraph paragraph = document.getParagraphArray(pos);
XmlCursor cursor = paragraph .getCTP().newCursor();
return document.insertNewParagraph(cursor);
}
public XWPFParagraph insertNewParagraph(int pos,int setLine){
XWPFParagraph paragraph = document.getParagraphArray(pos);
XmlCursor cursor = paragraph .getCTP().newCursor();
paragraph = document.insertNewParagraph(cursor);
setSingleLineSpacing(paragraph,setLine);
return paragraph;
}
public XWPFParagraph insertNewParagraph(XWPFParagraph paragraph){
XmlCursor cursor = paragraph .getCTP().newCursor();
return document.insertNewParagraph(cursor);
}
public XWPFTable insertNewTbl(int pos,boolean isAdaptContent){
XWPFParagraph paragraph = document.getParagraphArray(pos);
XmlCursor cursor = paragraph .getCTP().newCursor();
XWPFTable table = document.insertNewTbl(cursor);
//是否开启表格适应内容
if(!isAdaptContent){
CTTblPr tblPr = table.getCTTbl().getTblPr();
CTTblLayoutType t = tblPr.isSetTblLayout()?tblPr.getTblLayout():tblPr.addNewTblLayout();
t.setType(STTblLayoutType.FIXED);
}
return table;
}
public XWPFTable insertNewTbl(XWPFParagraph paragraph){
XmlCursor cursor = paragraph .getCTP().newCursor();
return document.insertNewTbl(cursor);
}
public void setRunText(XWPFRun run,String text,boolean isBold,int fontSize,String zFont,String eFont){
run.setBold(isBold);
run.setText(text);
run.setFontSize(fontSize);
CTRPr rpr = run.getCTR().isSetRPr() ? run.getCTR().getRPr() : run.getCTR().addNewRPr();;
CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
fonts.setAscii(eFont);
fonts.setEastAsia(zFont);
fonts.setHAnsi(zFont);
}
public void setXWPFParagraph(XWPFParagraph paragraph,ParagraphAlignment alignment,int line,String text,boolean isBold,int fontSize,String zFont,String eFont){
paragraph.setAlignment(alignment);
paragraph.setIndentationFirstLine(line);
XWPFRun run = paragraph.createRun();
setRunText(run,text,isBold,fontSize,zFont,eFont);
}
public void setXWPFParagraph(XWPFParagraph paragraph,int line,String text,boolean isBold,int fontSize,String zFont,String eFont){
paragraph.setIndentationFirstLine(line);
XWPFRun run = paragraph.createRun();
setRunText(run,text,isBold,fontSize,zFont,eFont);
}
public void setXWPFParagraph(XWPFParagraph paragraph,ParagraphAlignment alignment,String text,boolean isBold,int fontSize,String zFont,String eFont){
paragraph.setAlignment(alignment);
XWPFRun run = paragraph.createRun();
setRunText(run,text,isBold,fontSize,zFont,eFont);
}
public void setXWPFParagraph(XWPFParagraph paragraph,String text,boolean isBold,int fontSize,String zFont,String eFont){
XWPFRun run = paragraph.createRun();
setRunText(run,text,isBold,fontSize,zFont,eFont);
}
public void addBreak(XWPFParagraph paragraph){
List<XWPFRun> runs = paragraph.getRuns();
if(runs != null && runs.size() > 0){
paragraph.getRuns().get(runs.size() -1).addBreak();
}else{
paragraph.createRun().addBreak();
}
}
//设置上标
public void setSuperScript(XWPFParagraph paragraph,int leftIndent, String text,boolean isBold, int fontSize, String zFont, String eFont){
String [] array1 = text.split("}");
XWPFRun run;
paragraph.setIndentationFirstLine(leftIndent);
for(int i=0;i<array1.length;i++) {
String [] array2 = array1[i].split("\\{");
run = paragraph.createRun();
setRunText(run,array2[0],isBold,fontSize,zFont,eFont);
if(array2.length > 1){
run = paragraph.createRun();
run.setSubscript(VerticalAlign.SUPERSCRIPT);
setRunText(run,array2[1],isBold,fontSize,zFont,eFont);
}
}
}
public void setXWPFTableCell(XWPFTableCell tableCell,int setW){
/** 设置水平居中 */
CTTc cttc = tableCell.getCTTc();
CTTcPr ctPr = cttc.addNewTcPr();
ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
CTTblWidth ctTblWidth = ctPr.addNewTcW();
ctTblWidth.setW(BigInteger.valueOf(setW));
ctTblWidth.setType(STTblWidth.DXA);
}
public void setXWPFTableContentCell(XWPFTableCell tableCell,String text,boolean isBold, int fontSize, String zFont, String eFont){
XWPFParagraph paragraph = tableCell.getParagraphs().get(0);
if(paragraph == null){
paragraph = tableCell.addParagraph();
}
// setSingleLineSpacing(paragraph,480);
// setXWPFParagraph(paragraph,text, isBold,fontSize,zFont,eFont);
XWPFRun run;
String[] texts = StringUtils.split(text,"\n");
for (int i = 0; i < texts.length; i++) {
run = paragraph.createRun();
setRunText(run,texts[i],isBold,fontSize,zFont,eFont);
if(i < texts.length -1){
run.addBreak();
}
}
}
public void setXWPFTableTitleCell(XWPFTableCell tableCell,String text,boolean isBold, int fontSize, String zFont, String eFont){
XWPFParagraph paragraph = tableCell.getParagraphs().get(0);
if(paragraph == null){
paragraph = tableCell.addParagraph();
}
// setSingleLineSpacing(paragraph,480);
setXWPFParagraph(paragraph,text, isBold,fontSize,zFont,eFont);
}
public XWPFTableCell createXwpfTableContentCell(XWPFTableRow tableRow,Integer index){
XWPFTableCell tableCell = tableRow.getCell(index);
return tableCell;
}
public XWPFTableCell createXwpfTableContentCell(XWPFTableRow tableRow){
XWPFTableCell tableCell = tableRow.addNewTableCell();
return tableCell;
}
public XWPFTableCell createXwpfTableTitleCell(XWPFTableRow tableRow){
XWPFTableCell tableCell = tableRow.addNewTableCell();
return tableCell;
}
public void createXwpfTable(XWPFTable table,DnaDocTableDataDto tableDataDto,int lineHeight,int setW,boolean isTitleBold){
int length = tableDataDto.getTableHeader().size();
List<String> cells;
List<List<String>> list;
XWPFTableRow tableRow;
XWPFTableCell tableCell;
for(int i = 0 ; i < length ; i++){
cells = tableDataDto.getTableHeader().get(i);
//生成表格行,插入单元格
if(i == 0){
//第一行--设置完后以后创建的每一行都为第一行样式
tableRow = table.getRow(0);
for(int j = 0 ; j < cells.size() -1 ; j++){
tableCell = createXwpfTableTitleCell(tableRow);
setXWPFTableCell(tableCell,setW);
}
tableRow = table.getRow(0);
setTableRow(tableRow,lineHeight);
//去掉单元格左右边框
removeLeftAndRightBorders(tableRow,false,false,true,true);
}else{
tableRow = table.createRow();
setTableRow(tableRow,lineHeight);
removeLeftAndRightBorders(tableRow,false,false,true,true);
}
//开始加入内容
for(int j = 0 ; j < cells.size() ; j++){
tableCell = tableRow.getCell(j);
if(tableCell != null){
setXWPFTableTitleCell(tableCell,cells.get(j),isTitleBold,9,"仿宋_GB2312","Times New Roman");
setXWPFTableCell(tableCell,setW);
}
}
//样品内容
list = tableDataDto.getTableContentData().get(i);
for(List<String> cellList : list){
//一个样品一行
tableRow = table.createRow();
setTableRow(tableRow,lineHeight);
removeLeftAndRightBorders(tableRow,false,false,true,true);
for(int j = 0 ; j < cellList.size() ; j++){
//样品每个基因座下位点一列
tableCell = tableRow.getCell(j);
if(tableCell != null){
setXWPFTableContentCell(tableCell,cellList.get(j),false,9,"仿宋_GB2312","Times New Roman");
setXWPFTableCell(tableCell,setW);
}
}
}
//加入分割行
if(i < (length - 1)){
tableRow = table.createRow();
setTableRow(tableRow,lineHeight);
removeLeftAndRightBorders(tableRow,false,false,true,true);
for(int j = 0 ; j < tableRow.getTableCells().size() ; j++){
tableCell = tableRow.getCell(j);
if(tableCell != null){
setXWPFTableContentCell(tableCell,"",false,9,"仿宋_GB2312","Times New Roman");
setXWPFTableCell(tableCell,setW);
}
}
//合并表格行中的单元格
mergeCellsHorizontal(tableRow,0,cells.size()-1);
}
}
}
public void createXWPFHeader(List<String> list){
XWPFHeader xwpfHeader = document.getHeaderList().get(0);
XWPFParagraph paragraph = xwpfHeader.getParagraphArray(0);
XmlCursor cursor;
XWPFParagraph newPrap;
for(String string : list){
cursor = paragraph.getCTP().newCursor();
newPrap = xwpfHeader.insertNewParagraph(cursor);
newPrap.setAlignment(paragraph.getAlignment());
newPrap.setNumID(paragraph.getNumID());
// setHeaderAndFooterRun(newPrap,string);
}
}
/**
* 行间距
*/
public void setSingleLineSpacing(XWPFParagraph paragraph,int setLine) {
CTP ctp = paragraph.getCTP();
CTPPr ppr = ctp.isSetPPr() ? ctp.getPPr() : ctp.addNewPPr();
CTSpacing spacing = ppr.isSetSpacing()? ppr.getSpacing() : ppr.addNewSpacing();
spacing.setAfter(BigInteger.valueOf(0));
spacing.setBefore(BigInteger.valueOf(0));
spacing.setLineRule(STLineSpacingRule.EXACT);
spacing.setLine(BigInteger.valueOf(setLine));
}
public void removeLeftAndRightBorders(XWPFTableRow tableRow,Boolean top,Boolean bottom,Boolean left,Boolean right){
List<XWPFTableCell> cells = tableRow.getTableCells();
CTTcBorders tblBorders;
XWPFTableCell cell;
CTTcPr ctTcPr;
for(int i=0; i < cells.size(); i++) {
cell = tableRow.getCell(i);
ctTcPr = cell.getCTTc().isSetTcPr() ? cell.getCTTc().getTcPr() : cell.getCTTc().addNewTcPr();
tblBorders = ctTcPr.isSetTcBorders() ? ctTcPr.getTcBorders() : ctTcPr.addNewTcBorders();
if(top){
tblBorders.addNewTop().setVal(STBorder.NIL);
}
if(left){
tblBorders.addNewLeft().setVal(STBorder.NIL);
}
if(right){
tblBorders.addNewRight().setVal(STBorder.NIL);
}
if(bottom){
tblBorders.addNewBottom().setVal(STBorder.NIL);
}
tableRow.getCell(i).getCTTc().getTcPr().setTcBorders(tblBorders);
}
}
/**
* 合并表格
* @param fromCell 开始列索引
* @param toCell 结束列索引
*/
public void mergeCellsHorizontal(XWPFTableRow tableRow,int fromCell, int toCell) {
XWPFTableCell tableCell;
XWPFParagraph paragraph;
for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
tableCell = tableRow.getCell(cellIndex);
if(tableCell != null){
if ( cellIndex == fromCell ) {
// The first merged cell is set with RESTART merge value
tableCell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
} else {
// Cells which join (merge) the first one, are set with CONTINUE
tableCell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
}
paragraph = tableCell.getParagraphs().get(0);
paragraph.setAlignment(ParagraphAlignment.CENTER);
}
}
}
/**
* 获取图片对饮类型泛型值
* @param filePath
* @return
*/
Integer getImgType(String filePath){
String imgType = filePath.substring(filePath.indexOf(".")+1);
Integer typeNum = XWPFDocument.PICTURE_TYPE_PNG;
if(StringUtils.isNotBlank(imgType)){
if(imgType.equalsIgnoreCase("PNG")){
typeNum = XWPFDocument.PICTURE_TYPE_PNG;
}else if(imgType.equalsIgnoreCase("JPEG")){
typeNum = XWPFDocument.PICTURE_TYPE_JPEG;
}else if(imgType.equalsIgnoreCase("GIF")){
typeNum = XWPFDocument.PICTURE_TYPE_GIF;
}
}
return typeNum;
}
/**
* 获取图片对饮类型文件名
* @param filePath
* @return
*/
String getImgName(String filePath,String newPerfix){
String imgType = filePath.substring(filePath.indexOf(".")+1);
String newFileName = newPerfix + ".png";
if(StringUtils.isNotBlank(imgType)){
if(imgType.equalsIgnoreCase("PNG")){
newFileName = newPerfix + ".png";
}else if(imgType.equalsIgnoreCase("JPEG")){
newFileName = newPerfix + ".jpeg";
}else if(imgType.equalsIgnoreCase("GIF")){
newFileName = newPerfix + ".gif";
}
}
return newFileName;
}
public static void addPicture(XWPFParagraph paragraph,InputStream stream, int imgType, Double width, Double height){
try {
if(stream != null){
XWPFRun run;
run = paragraph.createRun();
run.addPicture(stream, imgType, System.currentTimeMillis()+".jpg", Units.toEMU(width), Units.toEMU(height));
}
}catch (Exception e){e.printStackTrace();}
}
/**
* 创建页脚
*/
public void createXWPFFooter(String text){
List<XWPFFooter> footerList = document.getFooterList();
XWPFFooter xwpfFooter = footerList.get(0);
XWPFParagraph prap = xwpfFooter.getParagraphArray(0);
// setHeaderAndFooterRun(prap,text);
// setHeaderAndFooterRun(prap,"第");
XWPFRun run = prap.createRun();
// setRun(run,HEADER_AND_FOOTER_FONT_SIZE,HEADER_AND_FOOTER_ZH,HEADER_AND_FOOTER_UK,false);
CTFldChar fldChar = run.getCTR().addNewFldChar();
fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
run = prap.createRun();
// setRun(run,HEADER_AND_FOOTER_FONT_SIZE,HEADER_AND_FOOTER_ZH,HEADER_AND_FOOTER_UK,false);
CTText ctText = run.getCTR().addNewInstrText();
ctText.setStringValue("PAGE \\* MERGEFORMAT");
ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
fldChar = run.getCTR().addNewFldChar();
fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
// setHeaderAndFooterRun(prap,"页/共");
run = prap.createRun();
// setRun(run,HEADER_AND_FOOTER_FONT_SIZE,HEADER_AND_FOOTER_ZH,HEADER_AND_FOOTER_UK,false);
fldChar = run.getCTR().addNewFldChar();
fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));
run = prap.createRun();
// setRun(run,HEADER_AND_FOOTER_FONT_SIZE,HEADER_AND_FOOTER_ZH,HEADER_AND_FOOTER_UK,false);
ctText = run.getCTR().addNewInstrText();
ctText.setStringValue("NUMPAGES \\* MERGEFORMAT ");//
ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));
fldChar = run.getCTR().addNewFldChar();
fldChar.setFldCharType(STFldCharType.Enum.forString("end"));
// setHeaderAndFooterRun(prap,"页");
}
public static void setTableRow(XWPFTableRow tableRow ,Integer height){
CTTrPr trPr = tableRow.getCtRow().addNewTrPr();
CTHeight ht = trPr.addNewTrHeight();
ht.setHRule(STHeightRule.AT_LEAST);
ht.setVal(BigInteger.valueOf(height));
}
public void write(String outPath){
try {
OutputStream out = new FileOutputStream(new File(outPath));
document.write(out);
out.close();
}catch (Exception r){
r.printStackTrace();
}
}
public void writeOutStream(OutputStream outputStreamt){
try {
document.write(outputStreamt);
}catch (Exception r){
r.printStackTrace();
}
}
调用代码:
DnaDocPoiUtil poiUtil = new DnaDocPoiUtil(inputStream);
int removeInt = 3;
XWPFParagraph paragraph;
//段落
paragraph = poiUtil.insertNewParagraph(poiUtil.getParagraphs().size() - removeInt,480);
poiUtil.setXWPFParagraph(paragraph,ParagraphAlignment.RIGHT, "鉴定编号:"+docDataDto.getAcceptNo() +"号", false,15,"仿宋_GB2312","Times New Roman");
paragraph = poiUtil.insertNewParagraph(poiUtil.getParagraphs().size() - removeInt,480);
poiUtil.setXWPFParagraph(paragraph,600,"一、绪论",false,15,"黑体","Times New Roman");
//表格
XWPFTable xwpfTable = poiUtil.insertNewTbl(poiUtil.getParagraphs().size() - removeInt,true);
poiUtil.createXwpfTable(xwpfTable,docDataDto.getYstrTableDataDto(),480,1000,true);