记Apache POI 导出数据到Excel


作为一个使用Python-flask转JavaWeb的菜鸡来说刚开始各种框架的配置当然是感到各种不爽。还在迷茫。
还是说说最近接触项目的小功能吧。

使用Apache Poi包实现导出Excel

说一下项目背景吧:把界面查询到的结果数据导出到Excel并实现下载。初略看了一下业务代码的实现,就是简单的数据库查询包装成Json格式的字符串,返回到前端。
这里的坑就比较大了,说一下我踩坑的经历吧。
刚开始我以为会很简单,在前端界面得到ClassName和对应的MethodName。正好Java有个映射,我们可以通过类名和方法名就可以直接调用查询数据库的方法。但是我不知道为什么,在js中找不到ClassName和MethodName,没有办法。这里有一点要注意的是,我们即使得到了这两个方法也要注意数据库查询的分页问题。没办法我没有得到,所以我自己重写了查询数据库的无分页方法。

Apache POI组件包含的类和方法

  • POIFS: 此组件是所有其他POI元件的基本因素。它被用来明确地读取不同的文件。
  • HSSF: 它被用来读取和写入MS-Excel文件的xls格式。
  • XSSF: 它是用于MS-Excel中XLSX文件格式。
  • HPSF: 它用来提取MS-Office文件属性设置。+
  • HWPF: 它是用来读取和写入MS-Word的文档扩展名的文件。
  • XWPF: 它是用来读取和写入MS-Word的docx扩展名的文件。
  • HSLF: 它是用于读取,创建和编辑PowerPoint演示文稿。
  • HDGF: 它包含类和方法为MS-Visio的二进制文件。
  • HPBF: 它被用来读取和写入MS-Publisher文件。
    我在这里只说一下关于XSSF的简单使用,而且只是一个导出的小案例。

简单教程

        HSSFWorkbook wb = new HSSFWorkbook();//类似于新建一个Excel文件
        HSSFSheet sheet = wb.createSheet();//类似于Excel中的sheet
        HSSFRow row = sheet.createRow(0);//类似于sheet中的每一行
        HSSFCell cell = null;//类似于sheet中的单元格

贴一下代码

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.struts2.ServletActionContext;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class toExcel {

    public String dataList;
    public String[] excelTitle;
    public String[] field;

    /*
     * createEasyExcel
     * 返回 HSSFWorkbook文件
     * 
     */
    private HSSFWorkbook createEasyExcel() throws JSONException{
        HSSFWorkbook wb = new HSSFWorkbook();
        /*
         * Apache poi 相关
         * 
         * row 行
         * cell 单元格
         * 
         */
        HSSFSheet sheet = wb.createSheet();
        HSSFRow row = sheet.createRow(0);

        HSSFCell cell = null;
        HSSFRow rows = null;



        for (int i = 0; i < excelTitle.length; i++) {
            cell = row.createCell(i);
            cell.setCellValue(excelTitle[i]);
        }

        String list = dataList;
        JSONObject obj = new JSONObject(list);
        JSONArray obj2 = obj.getJSONArray("rows");

        for (int i = 0; i < obj2.length(); i++) {  
            JSONObject temp = new JSONObject(obj2.getString(i));
            rows = sheet.createRow(i+1);
            for (int j = 0; j < field.length ; j++) {
                cell = rows.createCell(j);
                cell.setCellValue(temp.getString(field[j]));            
           }

        }
        return wb;

    }
    public void createExcel() {
        /*
         * response 响应头
         * 设置文件名称 result.xls
         */
        HttpServletResponse response = ServletActionContext.getResponse();
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename=result.xls");

        try {
            ServletOutputStream out = response.getOutputStream();
            createEasyExcel().write(out);
            out.flush();
            out.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * @author CourageShuo
     * @param dataList 数据源-是一个String类型的Json文件
     * @param excelTitle 是一个String[]类型,表示excel表头
     */
    public toExcel(String dataList,String[] excelTitle){                
        /*
         * response 响应头
         * 设置文件名称 result.xml
         */
        this.dataList = dataList;
        this.excelTitle = excelTitle;

    }
    /**
     * @author CourageShuo
     * @param dataList 数据源-是一个String类型的Json文件
     * @param excelTitle 是一个String[]类型,表示excel表头
     * @param field dataList中的field Json文件中的Key值 一定保持和excelTitle中的名字“对应”
     */
    public toExcel(String dataList,String[] excelTitle,String[] field) {
        this.dataList = dataList;
        this.excelTitle = excelTitle;
        this.field = field;
    }
}

这里我做了一个简单的封装,主要参数就是
- 数据源-是一个String类型的Json文件
- 是一个String[]类型,表示excel表头
- dataList中的field Json文件中的Key值 一定保持和excelTitle中的名字“对应”

你可能感兴趣的:(java)