JSP 利用Apache POI 操作 Word

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

先上个效果图:

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 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();
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容