Struts2 + jxl 实现导出数据到 excel(含前后端源代码)

Struts2 配置

<package name="xxx" namespace="/xxx" extends="json-default">
        <result name="excel" type="stream">
            <param name="contentType">application/vnd.ms-excel</param>
            <param name="inputName">is</param>
            <param name="contentDisposition">filename="xxx.xls"</param>
            <param name="bufferSize">1024</param>
        </result>
    </action>
</package>

这里重点是配置 result,即导出的数据流对象(类型为 stream)。

Action 类

...
InputStream is;

public String export() {
    Label label;
    WritableWorkbook workbook;
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    try {
        workbook = Workbook.createWorkbook(os);
        WritableSheet sheet = workbook.createSheet("sheet 名称", 0);

        /**
         * 获取数据
         */
        ...

        // 创建 Excel 标题行
        createTitleRow(sheet);
        // 设置列宽
        setColumnWidth(sheet);
        // 填充数据(Excel)
        fillData(sheet, data);

        workbook.write();
        workbook.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    is = new ByteArrayInputStream(os.toByteArray());
    return "excel";

}
...

/**
     * 填充数据(Excel)
     *
     * @param sheet
     * @param data
     * @throws WriteException
     */
    private void fillData(WritableSheet sheet, List<Entity> data) throws WriteException {
        int row = 1;
        for (Entity entity : data) {
            int column = 0;
            sheet.addCell(new Label(column++, row, valueOf(entity .getXXX
                    ())));
           ...
            row++;
        }
    }

    /**
     * 设置列宽(Excel)
     *
     * @param sheet
     */
    private void setColumnWidth(WritableSheet sheet) {
        for (int i = 0; i < 6; i++) {
            sheet.setColumnView(i, 20);
        }
    }

    /**
     * 创建标题行(Excel)
     *
     * @param sheet
     * @throws WriteException
     */
    private void createTitleRow(WritableSheet sheet) throws WriteException {
        int row = 0;
        int index = 0;
        sheet.addCell(new Label(index++, row, "标题列"));
        ...
    }

jxl 比 poi 轻量级,而且因为是老项目,你懂的 O(∩_∩)O

HTML

 <input type="button" value="导 出" 
                           onclick="export();">

js

function exportLeaveMessage() {
    var xxx=encodeURIComponent($("#xxx").val());
    ...
    window.open("<%=request.getContextPath()%>/xxx/xxx?xxx="+xxx);
}

注意:因为查询条件可能包含中文,所以这里必须使用 encodeURIComponent 进行编码。

是不是很简单呀 O(∩_∩)O哈哈~

猜你喜欢

转载自blog.csdn.net/deniro_li/article/details/80904918
今日推荐