将数据库中内容excel格式导出到本地

说明:使用poi将内容写入excel,需要的包有

 附件里是3.11版本的,足够用。也可以自己到https://poi.apache.org/ 下载

          

实现原理:获取到数据库中的内容后,将内容写入到excel中,再将excel读取到流中,由请求的response带回到本地

1.定义一个工具类来将数据写入excel再写入流中

public class ExportExcel {

public static void exportExcel(String[] headers,Collection dataset, String fileName,HttpServletResponse response) {  

        // 声明一个工作薄  

        XSSFWorkbook workbook = new XSSFWorkbook();  

        // 生成一个表格  

        XSSFSheet sheet = workbook.createSheet(fileName);  

        // 设置表格默认列宽度为20个字节  

        sheet.setDefaultColumnWidth((short) 20);  

        // 产生表格标题行  

        XSSFRow row = sheet.createRow(0);  

        for (short i = 0; i < headers.length; i++) {  

            XSSFCell cell = row.createCell(i);  

            XSSFRichTextString text = new XSSFRichTextString(headers[i]);  

            cell.setCellValue(text);  

        }  

        try {  

        //只有表头,没有内容时

        if (dataset!=null) {

            // 遍历集合数据,产生数据行 

            Iterator it = dataset.iterator();  

            int index = 0;  

            while (it.hasNext()) {  

                index++;  

                row = sheet.createRow(index); 

            //如果自己定义对象,传入list集合,直接使用反射存入不同的对象内容,则如下

                /*

                T t = (T) it.next();  

                // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值  

                Field[] fields = t.getClass().getDeclaredFields();  

                for (short i = 0; i < headers.length; i++) {  

                    XSSFCell cell = row.createCell(i);  

                    Field field = fields[i];  

                    String fieldName = field.getName();  

                    String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);  

                    Class tCls = t.getClass();  

                    Method getMethod = tCls.getMethod(getMethodName, new Class[] {});  

                    Object value = getMethod.invoke(t, new Object[] {}); 

                    */ 

                String[] strArray=(String[]) it.next();

                for (int i = 0; i < headers.length; i++) {

                XSSFCell cell = row.createCell(i);  

                  // 判断值的类型后进行强制类型转换  

                   String textValue = null;                    

                   textValue=strArray[i];                  

                    // 其它数据类型都当作字符串简单处理  

//                     if(value != null && value != ""){  

//                         textValue = value.toString();  

//                     }  

                    if (textValue != null) {  

                        XSSFRichTextString textString = new XSSFRichTextString(textValue);  

                        cell.setCellValue(textString);  

                    }  

                }  

             } 

        }

            getExportedFile(workbook, fileName,response);  

        } catch (Exception e) {  

            e.printStackTrace();  

        }   

    }  

      

    /** 

     * 方法说明: 指定路径下生成EXCEL文件  

     * @return 

     */  

    public static void getExportedFile(XSSFWorkbook workbook, String name,HttpServletResponse response) throws Exception {  

        BufferedOutputStream fos = null;  

        try {  

            String fileName = name + ".xlsx";  

            response.setContentType("application/x-msdownload");  

            response.setHeader("Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ));  

            fos = new BufferedOutputStream(response.getOutputStream());  

            workbook.write(fos);  

        } catch (Exception e) {  

            e.printStackTrace();  

        } finally {  

            if (fos != null) {  

                fos.close();  

            }  

        }  

    }  

}

2.controller中的处理

@RequestMapping(params = "method=toDownConsistDetailDest")

public void toDownConsistDetailDest(HttpServletRequest request, HttpServletResponse response) {

//获取前台传入的id,取得对应id下 的文件路径

String resultIdTemp = request.getParameter("resultId");

int resultId=0;

if (resultIdTemp!=null) {

resultId=Integer.parseInt(resultIdTemp);

}

//在此处获取要写入excel表格中的数组

DataConsistResult consistResultById = dataConsistResultService.getConsistResultById(resultId);

String destFilePath = consistResultById.getDestFilePath();

String destInfo = dataConsistResultService.getConsistResultDetailByPath(destFilePath);

//目标库数据

String[] destHeader = null;

List<String[]> destData=new ArrayList<>();

if (!"暂无数据".equals(destInfo)) {

String[] split = destInfo.split("\n");

destHeader = split[0].split("\\|");  

if (split.length>1) {

for (int i = 1; i < split.length; i++) {

String[] split2 = split[i].split("\\|");

destData.add(split2);

}

}else{

destData=null;

}

}

String destFileName=consistResultById.getTableName()+"目标库明细";

//需要传入的参数包括,表头字段数组  内容数组 文档的名字,response对象

ExportExcel.exportExcel(destHeader, destData, destFileName, response);

}

猜你喜欢

转载自yangzhe0609.iteye.com/blog/2419260