JSP 利用Apache POI 操作 Word

利用Apache POI 操作word, 生成简单的报告文档

先上个效果图:

JSP 利用Apache POI 操作 Word_第1张图片
word.png

到Apache下载 POI 需要的相关jar包

  1. poi-3.15.jar
  2. poi-ooxml-3.15.jar
  3. poi-ooxml-schemas-3.15.jar
  4. poi-scratchpad-3.15.jar
  5. 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 [email protected]
 * @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 rows = table.getRows();
        // 表格属性
        CTTblPr tablePr = table.getCTTbl().addNewTblPr();
        // 表格宽度
        CTTblWidth width = tablePr.addNewTblW();
        width.setW(BigInteger.valueOf(20000));

        XWPFTableRow row;
        List 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 rows = table.getRows();
        // 表格属性
        CTTblPr tablePr = table.getCTTbl().addNewTblPr();
        // 表格宽度
        CTTblWidth width = tablePr.addNewTblW();
        width.setW(BigInteger.valueOf(20000));

        XWPFTableRow row;
        List 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();
        }

你可能感兴趣的:(JSP 利用Apache POI 操作 Word)