POI 实现Excel 导出案例分析

简介:

无论使用poi还是使用jxl导出excel都需要用到流
一种是outputstrean,另一种fileoutputstream
第一种:

如果想要弹出保存的提示框必须加入下列三句
response.setContentType("application/vnd.ms-excel; charset=utf-8");
response.setHeader("Content-Disposition","attachment;filename="+filename);
response.setCharacterEncoding("utf-8");
OutputStream os=response.getOutputStream();
在使用第一种的时候,我用的ajax请求。导致excel无法导出,最后我直接请求可以导出(document.location.href="${pageContext.request.contextPath}/tran/export.do?")
原因是:ajax也用到了response.getWriter()方法 要将 数据结果回传,这里 我虽然 放弃了 回传的写入流writer 参数, 但是ajax还是会默认的去掉用,把流已经占用了,当然返回不了任何东西了。
第二种:
action中使用FileOutputStream fos=new FileOutputStream(file);
此时可以使用ajax请求,在导出成功后返回文件路径,在页面中使用window.open(path);即可打开导出的excel文件

wKiom1lnIAbADwAhAAD7xqMY0tE808.png-wh_50

jsp页面:

     function exportExcel(){
         var ids = [];
         var rows = $('#dbgrid').datagrid('getSelections');
         if (rows.length < 1) {
             $.messager.alert('提示', '<br>请选中您要导出的记录!', 'info');
             return;
         }
         for (var i = 0; i < rows.length; i++) {
             ids.push(rows[i][getId()]);
         }
         //console.log("---ids---"+ids.join(","))
         location.href = "${path}/admin/export/export.do?ids="+ids.join(",");
     } 


Action:


package com.shangyu.action.dsz;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.shangyu.common.util.SpringContextHelper;
import com.shangyu.entity.dsz.DispatchOrder;
import com.shangyu.entity.dsz.DispatchParam;
import com.shangyu.service.dsz.DispatchOrderService;
import com.shangyu.service.dsz.DispatchParamService;
import com.shangyu.service.system.SysUserService;

/**
 * @desc 导出Excel
 * @author hykang
 *
 */

@Controller
@RequestMapping("/admin/export")
public class ExportController {

    @Resource
    private DispatchOrderService dispatchOrderService;
    @Resource
    private DispatchParamService dispatchParamService;
    @Resource
    private SysUserService sysUserService;
    
    @SuppressWarnings("deprecation")
    @RequestMapping("export.do")
    public void exportList(HttpServletRequest req,HttpServletResponse response) throws Exception{
        String ids = req.getParameter("ids");
        String[] str=ids.split(",");
        String[] ids1=new String[str.length];
        List<DispatchOrder> orderlist = new ArrayList<>();
        for(int i=0;i<str.length;i++){
            ids1[i]=str[i];
            DispatchOrder entity = dispatchOrderService.getById(ids1[i]);
            orderlist.add(entity);
        }
        
        HSSFWorkbook wb=new HSSFWorkbook();
        HSSFSheet sheet=wb.createSheet("派工单数据汇总");
        HSSFRow row=sheet.createRow(0);
        //创建单元格,并设置值表头 设置表头居中
        HSSFCellStyle style = wb.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);    // 创建一个居中格式
        //style.setWrapText(true);//允许自动换行
        
        //表头
        String[] headers={"派工单编号","部门名称","负责人","创建时间","派工时间","合计工时"};
         //填充表头
        for (short i = 0; i < headers.length; i++) {
            HSSFCell cell = row.createCell(i);
            cell.setCellStyle(style);
            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
            cell.setCellValue(text);
        }
        
        for (int i = 0; i < orderlist.size(); i++) {
            row = sheet.createRow(i + 1);
            row.setHeightInPoints(18); //设置行高
            
            DispatchOrder record = orderlist.get(i);
            String createtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(record.getCreateTime());
            String disptchtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(record.getDispatchTime());
            
            row.createCell(0).setCellValue(record.getDispatchCode());
            sheet.setColumnWidth(0, (record.getDispatchCode().getBytes().length + 4)*256);
            
            if(org.apache.commons.lang3.StringUtils.isNotEmpty(getName(record.getDeptName()) )){
                row.createCell(1).setCellValue(getName(record.getDeptName()));
                sheet.setColumnWidth(0, (record.getDispatchCode().getBytes().length + 4)*256);
            }
            if(org.apache.commons.lang3.StringUtils.isNotEmpty(getName(record.getManager()))){
                row.createCell(2).setCellValue(getName(record.getManager()));
                sheet.setColumnWidth(1, (getName(record.getDeptName()).getBytes().length + 4)*256);
            }
            row.createCell(3).setCellValue(createtime);
            sheet.setColumnWidth(3, (createtime.getBytes().length + 4)*256);
            
            row.createCell(4).setCellValue(disptchtime);
            sheet.setColumnWidth(4, (disptchtime.getBytes().length + 4)*256);
            
            if(org.apache.commons.lang3.StringUtils.isNotEmpty(String.valueOf(record.getTotalWork()))){
                row.createCell(5).setCellValue(String.valueOf(record.getTotalWork()));
            }
            
        }
          
        //sheet.setDefaultColumnWidth(18); //为全部列的列宽设置默认值
        String filename=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date())+".xls";
        //response.reset();//一般情况可以不写
        //response.setHeader("Content-disposition", "attachment;filename="+toUtf8String(fileName));//字符串转码
        response.setHeader("Content-Disposition", "attachment;filename="
                +new String(filename.getBytes("utf-8"),"iso8859-1"));
        response.setHeader("Connection", "close");
        response.setHeader("Content-Type", "application/vnd.ms-excel");
        wb.write(response.getOutputStream());

     }
     
    public static String toUtf8String(String s){ 
        StringBuffer sb = new StringBuffer(); 
          for (int i=0;i<s.length();i++){ 
             char c = s.charAt(i); 
             if (c >= 0 && c <= 255){sb.append(c);} 
           else{ 
           byte[] b; 
            try { b = Character.toString(c).getBytes("utf-8");} 
            catch (Exception ex) { 
                System.out.println(ex); 
                     b = new byte[0]; 
            } 
               for (int j = 0; j < b.length; j++) { 
                int k = b[j]; 
                 if (k < 0) k += 256; 
                 sb.append("%" + Integer.toHexString(k).toUpperCase()); 
                 } 
        } 
     } 
     return sb.toString(); 
   }
    
    public static String getName(String id){
        String name = "";
        DispatchParamService dispatchParamService = SpringContextHelper.getBean(DispatchParamService.class);
        try {
            DispatchParam param = dispatchParamService.getById(id);
            name = param.getParamName();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return name;
    }
    
}


参考文档:

Springmvc和poi3.9导出excel并弹出下载框

利用POI 导出EXCEL,弹出保存框



本文转自 沉淀人生 51CTO博客,原文链接:http://blog.51cto.com/825272560/1947114


相关文章
|
1月前
|
前端开发
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
30 1
|
1月前
|
数据格式 UED
记录一次NPOI库导出Excel遇到的小问题解决方案
【11月更文挑战第16天】本文记录了使用 NPOI 库导出 Excel 过程中遇到的三个主要问题及其解决方案:单元格数据格式错误、日期格式不正确以及合并单元格边框缺失。通过自定义单元格样式、设置数据格式和手动添加边框,有效解决了这些问题,提升了导出文件的质量和用户体验。
176 3
|
1月前
|
Java API Apache
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
70 4
|
2月前
|
JavaScript 前端开发 数据处理
Vue导出el-table表格为Excel文件的两种方式
Vue导出el-table表格为Excel文件的两种方式
110 6
|
2月前
|
前端开发 JavaScript Java
导出excel的两个方式:前端vue+XLSX 导出excel,vue+后端POI 导出excel,并进行分析、比较
这篇文章介绍了使用前端Vue框架结合XLSX库和后端结合Apache POI库导出Excel文件的两种方法,并对比分析了它们的优缺点。
857 0
|
23天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
2月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
160 4
|
4月前
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
54 0
|
2月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
110 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档