,批量导出数据到excel中(包含每条数据对应的附件)
本程序功能功能说明
采用压缩的方法把用户要导出的excel 文件和excle数据中每条数据对应的文件,打包成一个大文件,输出到缓存区,用户通过浏览器来下载这个文件,缺陷是文件过大时,比如几个G大小的附件,ie下载很慢。建议用360等支持断点续传的功能的浏览器来下载。
Excel查看附件采用的是链接方式
详细如下面截图,点击文件链接,可以链接到相对文件位置的文件夹(因为附件可能是多个,采用的都是文件夹的相对链接的方式实现的),
压缩包内存放的文件结构:
Excel文件,reportfile(存放附件的文件夹,文件夹结构详细见代码)
每行excel 都对应相对的文件夹(reportfile内的某一个子文件夹和excel的行号相对应),如下截图,红圈圈链接的就是对应的相应文件夹下的appfile文件夹下的文件:
//引入的类
import ls.zip.ZipEntry;
//把文件写入到压缩对象out
import ls.zip.ZipOutputStream;
import java.io.*;
importjava.io.OutputStream;
importjava.util.ArrayList;
importjava.util.LinkedHashMap;
importjava.util.List;
importorg.apache.poi.hssf.usermodel.HSSFCell;
importorg.apache.poi.hssf.usermodel.HSSFCellStyle;
importorg.apache.poi.hssf.usermodel.HSSFFont;
importorg.apache.poi.hssf.usermodel.HSSFRichTextString;
importorg.apache.poi.hssf.usermodel.HSSFRow;
importorg.apache.poi.hssf.usermodel.HSSFSheet;
importorg.apache.poi.hssf.usermodel.HSSFWorkbook;
importorg.apache.poi.hssf.util.HSSFCellUtil;
importorg.apache.poi.hssf.util.HSSFColor;
importorg.apache.poi.hssf.util.Region;
importorg.apache.poi.ss.usermodel.Font;
importorg.apache.poi.hssf.usermodel.HSSFHyperlink;
//写入压缩的文件对象
privatevoidzipfileinfo(ZipOutputStream out, File f, String base)
            throws Exception
{
//记录文件“f”对象在压缩包中的位置及压缩后的文件名称:
        out.putNextEntry(newZipEntry(base));
// 写入压缩文件对象
        FileInputStream in = newFileInputStream(f);
        int b = 0;
        byte[] buf = newbyte[1024];
        while ((b = in.read(buf)) != -1)
{
            out.write(buf, 0, b);
        }
        in.close();
}
// replaceall()开始压缩文件
privatevoidziptmpfilelist(ZipOutputStream out, String factfielnamelist,
            String tmpfielnamelist) throws Exception {
        String[] tmpList = tmpfielnamelist.split(";");
        String[] fackList = factfielnamelist.split(";");
        for (inti = 0; i<tmpList.length; i++) {
            File tmpfile = new File(fackList[i]);
            zipfileinfo(out, tmpfile, tmpList[i].replaceAll("\\\\", "/"));
        }
    }
    @Override
    protectedvoiddoGet(HttpServletRequest request,
            HttpServletResponse response) throwsServletException, IOException {
// 存放文件的实际位置位置(绝对路径)
String factfielnamelist=
"D:\\iscm\\attachdata\\2015\\0422\\FuaiFugQArVTjpG;D:\\iscm\\attachdata\\2015\\0422\\HIxtANutsZrwDTZ;D:\\iscm\\attachdata\\2015\\0422\\HIxtANutsZrwDTZ";
// 存放文件的位置(绝对路径)压缩时对应文件在压缩文件中的位置及名称
        String tmpfielnamelist = "reportfile\\tmp1\\appfile\\项目审批2.ipa;reportfile\\tmp1\\appfile\\项目审批1.doc;reportfile\\tmp1\\selffile\\app.docx";
        try {
// 存放临时文件的目录(绝对路径)ZipOutputStream out = new ZipOutputStream(new FileOutputStream("d:\\test.zip"));
    set();
    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment;filename=test.zip");
           
// 输出到缓存区方式
ZipOutputStream out = new OutputStream());
            // out.setEncoding("gbk");
            out.setEncoding("gb2312");
            //System.out.println(zipFileName);
            ziptmpfilelist(out, factfielnamelist, tmpfielnamelist);
//输出到excel中 List<LinkedHashMap<String, Object>> result 是excel写入的数据集合,这个需要自己重新定义.
portExcelAppReoort("App报备信息", headers, columns,result, "", out);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
}
创建excel对象并写入压缩包方法
/**
    * 控制点导出Excel的方法
    * @param title excel中的sheet名称
    * @param headers 表头
    * @param columns 表头对应的数据库中的列名
    * @param result 结果集
    * @param out 输出流
    * @param pattern 时间格式
    * @throws Exception
    */
publicstaticvoidexportExcelAppReoort(String title, String[] headers, String[] columns, List<LinkedHashMap<String, Object>> result, String filepath, ZipOutputStream out) throws Exception{ 
   
    //java.io.FileOutputStream out=new java.io.FileOutputStream(filepath); 
   
    // 声明一个工作薄
HSSFWorkbook workbook = newHSSFWorkbook(); 
// 生成一个表格
HSSFSheet sheet = ateSheet(title); 
// 设置表格默认列宽度为20个字节
sheet.setDefaultColumnWidth(20); 
// 生成一个样式
HSSFCellStyle style = ateCellStyle(); 
// 设置这些样式
style.setFillForegroundColor(HSSFColor.GOLD.index); 
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 
style.setBorderBottom(HSSFCellStyle.BORDER_THIN); 
style.setBorderLeft(HSSFCellStyle.BORDER_THIN); 
style.setBorderRight(HSSFCellStyle.BORDER_THIN); 
style.setBorderTop(HSSFCellStyle.BORDER_THIN); 
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
// 生成一个字体
HSSFFont font = ateFont(); 
font.setColor(HSSFColor.VIOLET.index); 
//font.setFontHeightInPoints((short) 12); 
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。