利用Apache POI 操作word, 生成简单的报告文档
先上个效果图:
word.png
到Apache下载 POI 需要的相关jar包
- poi-3.15.jar
- poi-ooxml-3.15.jar
- poi-ooxml-schemas-3.15.jar
- poi-scratchpad-3.15.jar
- xmlbeans-2.6.0.jar
将这些jar存放于
WebContent
-- Web-INT
-- lib (放于这个文件夹内)
在src 创建一个类 CreateReport
package cn.hejing.util;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigInteger;
import java.util.List;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
/**
* @author hejing
* @email 2010jing@gmail.com
* @date datetime 2016年9月23日 下午4:44:33
* @description
* @version 1.0
* @since
*/
public class CreateReport {
private XWPFDocument doc;
public void CreateReportDoc() throws Exception {
doc = new XWPFDocument();
// 创建一个段落
XWPFParagraph para = doc.createParagraph();
// 设置对齐方式
para.setAlignment(ParagraphAlignment.CENTER);
// 一个XWPFRun代表具有相同属性的一个区域。
XWPFRun run = para.createRun();
// 加粗
run.setBold(true);
// 设置内容
run.setText("X Project Report");
// 设置字体大小
run.setFontSize(20);
// 换行
run.addBreak();
para = doc.createParagraph();
para.setAlignment(ParagraphAlignment.CENTER);
run = para.createRun();
run.setBold(false);
run.setText("--Author: 静静");
run.setFontSize(10);
run.addBreak();
para = doc.createParagraph();
para.setAlignment(ParagraphAlignment.LEFT);
run = para.createRun();
run.setBold(true);
run.setText("APACHE PROJECTS");
run.setFontSize(16);
run.addBreak();
para = doc.createParagraph();
para.setAlignment(ParagraphAlignment.BOTH);
run = para.createRun();
run.setBold(false);
run.setFontSize(12);
run.setText(
"The all-volunteer ASF develops, stewards, and incubates more than 350 Open Source projects and initiatives that cover a wide range of technologies. From Abdera to Zookeeper, if you are looking for a rewarding experience in Open Source and industry leading software, chances are you are going to find it here. Are you powered by Apache?");
para = doc.createParagraph();
para.setAlignment(ParagraphAlignment.LEFT);
run = para.createRun();
run.setBold(true);
run.setText("1. Create Table");
run.setFontSize(16);
run.addBreak();
// 生成 table
createTable();
para = doc.createParagraph();
para.setAlignment(ParagraphAlignment.LEFT);
run = para.createRun();
run.setBold(true);
run.setText("2. Insert Chart");
run.setFontSize(16);
run.addBreak();
// 插入圖片
String imgFile = "C:\\hejing\\work\\workshop\\java-project\\ChartDemo\\pieChart.png";
FileInputStream is = new FileInputStream(imgFile);
run.addBreak();
run.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, imgFile, Units.toEMU(400), Units.toEMU(280)); // 400x280
// pixels
is.close();
OutputStream os = new FileOutputStream("C:\\hejing\\work\\workshop\\java-project\\ChartDemo\\Report.docx");
// 把doc输出到输出流
doc.write(os);
this.close(os);
}
/**
*
* @Title: createTable @Description: TODO @param 参数 @return void
* 返回类型 @throws
*/
private void createTable() {
// 構造數據 也可以從數據庫獲取存入二維數據
String[][] tableData = {
{ "1", "Horrible SpreadSheet Format API's for reading/writting Excel files using pure Java.",
"Level 1" },
{ "2", "This package contains classes that implement cell formatting.", "Level 2" },
{ "3", "This package contains common internal POI code for manipulating formulas.", "Level 3" } };
// 创建一个3行3列的表格
XWPFTable table = doc.createTable(3, 3);
// 获取table rows List
List<XWPFTableRow> rows = table.getRows();
// 表格属性
CTTblPr tablePr = table.getCTTbl().addNewTblPr();
// 表格宽度
CTTblWidth width = tablePr.addNewTblW();
width.setW(BigInteger.valueOf(20000));
XWPFTableRow row;
List<XWPFTableCell> cells;
XWPFTableCell cell;
int rowSize = rows.size();
int cellSize;
for (int i = 0; i < rowSize; i++) {
row = rows.get(i);
// 新增单元格
// row.addNewTableCell();
// 设置行的高度
// row.setHeight(500);
// 行属性
// CTTrPr rowPr = row.getCtRow().addNewTrPr();
// 这种方式是可以获取到新增的cell的。
cells = row.getTableCells();
cellSize = cells.size();
for (int j = 0; j < cellSize; j++) {
cell = cells.get(j);
// 单元格属性
CTTcPr cellPr = cell.getCTTc().addNewTcPr();
cellPr.addNewVAlign().setVal(STVerticalJc.TOP);
if (j == 1) {
// 设置宽度
cellPr.addNewTcW().setW(BigInteger.valueOf(6000));
} else if (j == 2) {
cellPr.addNewTcW().setW(BigInteger.valueOf(1000));
}
cell.setText(tableData[i][j]);
}
}
}
/**
* 关闭输出流
*
* @param os
*/
private void close(OutputStream os) {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
简单概括 重点知识,更多请前往官网学习,第一次接触学习,如有不对烦请指出,必定虚心学习。
private XWPFDocument doc;
doc = new XWPFDocument();
实例化一个doc文档。
// 创建一个段落
XWPFParagraph para = doc.createParagraph();
// 设置对齐方式
para.setAlignment(ParagraphAlignment.CENTER);
// 一个XWPFRun代表具有相同属性的一个区域。
XWPFRun run = para.createRun();
// 加粗
run.setBold(true);
// 设置内容
run.setText("X Project Report");
// 设置字体大小
run.setFontSize(20);
// 换行
run.addBreak();
在文档内,创建一个段落,设置对齐方式。
XWPFRun代表具有相同属性的一个区域,所以在区域内设置字体的样式,以为文字内容。
/**
*
* @Title: createTable @Description: TODO @param 参数 @return void
* 返回类型 @throws
*/
private void createTable() {
// 構造數據 也可以從數據庫獲取存入二維數據
String[][] tableData = {
{ "1", "Horrible SpreadSheet Format API's for reading/writting Excel files using pure Java.",
"Level 1" },
{ "2", "This package contains classes that implement cell formatting.", "Level 2" },
{ "3", "This package contains common internal POI code for manipulating formulas.", "Level 3" } };
// 创建一个3行3列的表格
XWPFTable table = doc.createTable(3, 3);
// 获取table rows List
List<XWPFTableRow> rows = table.getRows();
// 表格属性
CTTblPr tablePr = table.getCTTbl().addNewTblPr();
// 表格宽度
CTTblWidth width = tablePr.addNewTblW();
width.setW(BigInteger.valueOf(20000));
XWPFTableRow row;
List<XWPFTableCell> cells;
XWPFTableCell cell;
int rowSize = rows.size();
int cellSize;
for (int i = 0; i < rowSize; i++) {
row = rows.get(i);
// 新增单元格
// row.addNewTableCell();
// 设置行的高度
// row.setHeight(500);
// 行属性
// CTTrPr rowPr = row.getCtRow().addNewTrPr();
// 这种方式是可以获取到新增的cell的。
cells = row.getTableCells();
cellSize = cells.size();
for (int j = 0; j < cellSize; j++) {
cell = cells.get(j);
// 单元格属性
CTTcPr cellPr = cell.getCTTc().addNewTcPr();
cellPr.addNewVAlign().setVal(STVerticalJc.TOP);
if (j == 1) {
// 设置宽度
cellPr.addNewTcW().setW(BigInteger.valueOf(6000));
} else if (j == 2) {
cellPr.addNewTcW().setW(BigInteger.valueOf(1000));
}
cell.setText(tableData[i][j]);
}
}
}
将创建table,封装到一个方法内。代码中已经添加了详细注解。
// 插入圖片
String imgFile = "C:\\hejing\\work\\workshop\\java-project\\ChartDemo\\pieChart.png";
FileInputStream is = new FileInputStream(imgFile);
run.addBreak();
run.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, imgFile, Units.toEMU(400), Units.toEMU(280)); // 400x280
is.close();
指定图片路径,获取文件流,调用 addPicture方法添加到文档内,并设置图片类型以及大小。
OutputStream os = new FileOutputStream("C:\\hejing\\work\\workshop\\java-project\\ChartDemo\\Report.docx");
// 把doc输出到输出流
doc.write(os);
this.close(os);
最后生成word文档
在src 创建一个 CreateWordDoc servlet
在doGet()方法内添加下面代码
CreateReport cr = new CreateReport();
try {
cr.CreateReportDoc();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}