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文件

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,弹出保存框

时间: 2024-08-29 23:05:06

POI 实现Excel 导出案例分析的相关文章

Jsoup抓取、解析网页和poi存取excel综合案例——采集网站的联系人信息

需求:采集网站中每一页的联系人信息 一.创建maven工程,添加jsoup和poi的依赖包 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.16-be

poI 以Excel导出数据

导入jar包,参考 http://zhuws.blog.51cto.com/11134439/1973698 2.步入正题,看代码 // 大致思路,先看本地文件存在不,如果不存在,把查询数据导出到Excel,然后再下载 代码有点乱 String filePath = request.getParameter("filePath"); filePath = new String( filePath.getBytes("iso-8859-1"), "UTF-8

poi实现Excel导出

最近做了一个导出Excel的小功能,以前没接触过,现在分享下自己的代码,想让各位帮忙看看有啥地方可以优化,也方便自己以后查阅... 首先是excelAction的代码: 1 /** 2 * excelAction 3 * @author zhaoxz 4 * 5 */ 6 @Controller("excelAction") 7 @Scope("prototype") 8 public class ExcelAction extends BaseAction { 9

POI通过模板导出EXCEL文件

一般的EXCEL导出使用POI先创建一个HSSFWorkbook,然后通过不断创建HSSFRow,HSSFCell后设置单元格内容便可以完成导出. 这次在项目中需要用到模板,导出的内容包括(1.模板中的内容.样式.2.自己需要新增的内容.样式.),还需要设置单元格的样式,在网上搜了一些blog,完成后记录一下. 分析这次需求,最关键的就是如何获取到填充了模板的新HSSFWorkbook,如果获取到它,我们可以熟练的往里面添加内容. 1 File fi = new File("F:/usr/use

Java使用POI实现数据导出excel报表

在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅仅简单的读取office中的数据.尤其是在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF .所以今天我们来简单看一下利用Apache  POI实现数据库中数据导出excel报表.在java中有很多实现数据导出excel报表的第三方jar包.但在比较了一下感觉还是POI相对来

如何使用POI对Excel表进行导入和导出

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 结构: HSSF - 提供读写Microsoft Excel格式档案的功能. XSSF - 提供读写Microsoft Excel OOXML格式档案的功能. HWPF - 提供读写Microsoft Word格式档案的功能. HSLF - 提供读写Microsoft PowerPoint格式档案的功能. HDGF - 提供读写Microsoft

java使用POI操作excel文件,实现批量导出,和导入

一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel. POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现",利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能.官网:htt

Java通过POI技术操作Excel(3)----数据导出

在之前的博客中,总结了Excel模板生成和Excel数据录入,然后剩最后一个模块,数据库中数据读取,在之前的基础上我们来看这一模块,应该已经非常容易了,接下来简单的介绍一下: 这里我们仍然以jsp+servlet为例,对SqlServer2005数据库进行操作,如下都是基本步骤: 1.连接数据库:2.根据sql语句获取数据库中值:3.将值进行导出操作: 首先,我们来记性数据库的连接,这个相信接触过java的人都不会陌生,我就不赘述了 1 public class DataBase { 2 pri

框架 day50 BOS项目 4 批量导入(ocupload插件,pinyin4J)/POI解析Excel/Combobox下拉框/分区组合条件分页查询(ajax)/分区数据导出(Excel)

知识点: 批量导入(ocupload插件,pinyin4J /POI解析Excel(apache POI) /区域分页查询 /Combobox下拉框 /分区组合条件分页查询(ajax) /分区数据导出(Excel下载) BOS项目笔记第4天 1.    区域批量导入功能 *Ajax不支持文件上传. *上传并且不刷新上传页面原理: Target到一个0,0,0的隐藏iframe里,造成一个没有刷新的假象 <form target="myIframe" action="ab