2017-07-27 13:47:36 mingshen3 阅读数 1360
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1263 人正在学习 去看看 钟林森
通过传入实体类数组和指定导出列来即可,导出excel,读者可直接复制到项目直接使用,下面只是个简单的示例提供参考

一、导出excel工具类代码
  1. /**
  2. * 导出实体类
  3. * @param head 表头
  4. * @param exportColumn 导出字段
  5. * @param exportList 实体数组
  6. * @param clazz 实体类
  7. * @return
  8. * @throws Exception
  9. */
  10. public SXSSFWorkbook export(String[] head,String[] exportColumn,List exportList,Class clazz) throws Exception{
  11. XSSFWorkbook wb = new XSSFWorkbook ();
  12. SXSSFWorkbook swb=new SXSSFWorkbook(wb,1000);
  13. //swb.createSheet()
  14. //创建第一个sheet(页),命名为 new sheet
  15. SXSSFSheet sheet = null;
  16. sheet = (SXSSFSheet) swb.createSheet("myData");
  17. //创建head
  18. SXSSFRow heqadrow = sheet.createRow(0);
  19. int headlen = head.length;
  20. for(int i=0;i<headlen;i++) {
  21. heqadrow.createCell(i).setCellValue(head[i]);
  22. }
  23. //获取导出列
  24. List<String> columnNameList = new ArrayList<String>();
  25. if(exportColumn!=null&&exportColumn.length>0) {
  26. int columnNameLen = exportColumn.length;
  27. for(int i=0;i<columnNameLen;i++){
  28. columnNameList.add(exportColumn[i]);
  29. }
  30. } else {//通过反射获取所有列
  31. //暂未实现
  32. System.err.println("请指明导出列");
  33. }
  34. //导出列
  35. int exportListLen = exportList.size();
  36. List<Method> methodList = new ArrayList<Method>();
  37. int columnNameListLen = columnNameList.size();
  38. for(int i=0;i<columnNameListLen;i++){
  39. String methodName= "get".concat(captureName(columnNameList.get(i).toLowerCase()));
  40. Method method = clazz.getMethod(methodName);
  41. methodList.add(method);
  42. }
  43. for(int i=1;i<=exportListLen;i++){
  44. Object entity = exportList.get(i-1);
  45. SXSSFRow row = sheet.createRow(i);
  46. for(int j=0;j<columnNameListLen;j++) {
  47. Object value = methodList.get(j).invoke(entity);
  48. if(value!=null) {
  49. row.createCell(j).setCellValue(value.toString());
  50. }
  51. }
  52. }
  53. //写入文件
  54. /*FileOutputStream fos = new FileOutputStream("e:\\txt.xls");
  55. swb.write(fos);
  56. fos.flush();*/
  57. return swb;
  58. }
二、导出excel的controller下载部分
  1. SXSSFWorkbook wb = eu.export(head, exportColumn, easyJson.getRows(), TReportyszxqk.class);
  2. OutputStream output=response.getOutputStream(); //response为springMVC传入的httpservletResponse
  3. response.reset();
  4. response.setHeader("Content-disposition", "attachment; filename=details.xls");
  5. response.setContentType("application/msexcel");
  6. wb.write(output);
  7. output.close();
三、前端下载部分
1.html
  1. <form action="exportYszx" style="display:none" id="downForm" method="post">
  2. </form>
  1. <button id="btn_export"> 导出</button>
2.js
  1. $("#btn_export").click(function(){
  2. $("#downForm").empty();
  3. for(var key in searchData){
  4. var input = "<input name='"+key+"'value='"+searchData[key]+"'>";
  5. $("#downForm").append(input)
  6. }
  7. $("#downForm").submit();
  8. })


2019-05-15 17:07:22 WYA1993 阅读数 108
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1263 人正在学习 去看看 钟林森

先上代码:

定义需要导出的实体类

@Data
public class Student implements Serializable {

    private Integer id;
    private String studentName;
    private Integer age;
    private LocalDate birth;
    private String desc;
    private Double weight;
    private Double height;

}

定义导出Excel的工具类

public class ExcelUtil {

    /**
     * 数据量过大时可通过此属性拆分多个sheet页
     */
    private static final int MAX_ROW_NUM = 5000;

    /**
     * 通过反射的方式导出Excel
     *
     * @param dataList
     * @param path
     * @param fields
     * @param <K>
     * @throws Exception
     */
    public static <K> void export(List<K> dataList, String path, Map<String, String> fields) throws Exception {
        if (dataList == null || dataList.size() == 0) {
            throw new Exception("dataList is empty");
        }
        if (fields == null || fields.isEmpty()) {
            throw new ExcelException("fields map is empty");
        }
//        int sheetSize = dataList.size() / MAX_ROW_NUM;
//        if (dataList.size() % MAX_ROW_NUM != 0) {
//            sheetSize += 1;
//        }
        XSSFWorkbook workbook = new XSSFWorkbook();
        String[] fieldNames = new String[fields.keySet().size()];
        String[] displayNames = new String[fields.keySet().size()];
        int i = 0;
        for (String fieldName : fields.keySet()) {
            fieldNames[i] = fieldName;
            displayNames[i] = fields.get(fieldName);
            i ++;
        }
        XSSFSheet sheet = workbook.createSheet();
        XSSFRow row = sheet.createRow(0);
        // 初始化列名
        for (int cellNum = 0; cellNum < displayNames.length; cellNum++) {
            row.createCell(cellNum).setCellValue(displayNames[cellNum]);
        }
        XSSFCell cell;
        K data;
        for (int j = 0; j < dataList.size(); j++) {
            row = sheet.createRow(j + 1);
            data = dataList.get(j);
            for (int cellNum = 0; cellNum < fieldNames.length; cellNum++) {
                cell = row.createCell(cellNum);
                // 通过反射的方式取值赋给单元格
                Field field = data.getClass().getDeclaredField(fieldNames[cellNum]);
                field.setAccessible(true);
                if (field.get(data) == null) {
                    cell.setCellValue("");
                } else if (field.getType() == String.class) {
                    cell.setCellValue((String) field.get(data));
                } else if (field.getType() == Integer.class) {
                    cell.setCellValue((Integer)field.get(data));
                } else if (field.getType() == Double.class) {
                    cell.setCellValue((Double)field.get(data));
                } else if (field.getType() == LocalDate.class) {
                    cell.setCellValue(((LocalDate)field.get(data)).format(DateTimeFormatter.ISO_DATE));
                }
            }
        }
        OutputStream out = null;
        try{
            out = new FileOutputStream(path);
            workbook.write(out);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                out.close();
            }
        }
    }

}

定义测试类

@org.junit.Test
    public void test() throws Exception {
        Map<String, String> fields = new HashMap<>();
        fields.put("id", "编号");
        fields.put("studentName", "姓名");
        fields.put("age", "年龄");
        fields.put("birth", "生日");
        fields.put("desc", "简介");
        fields.put("weight", "体重");
        fields.put("height", "身高");

        List<Student> dataList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Student student = new Student();
            student.setId(i + 1);
            student.setStudentName("学生" + i);
            student.setAge(i + 20);
            student.setBirth(LocalDate.now());
            student.setHeight(175.67D);
            student.setWeight(120.66D);
            dataList.add(student);
        }
        String path = "D://student.xlsx";
        ExcelUtil.export(dataList, path, fields);
    }

查看效果

缺点:需要定义实体类

优点:使用反射的方式比较灵活,减少了很多获取值的硬编码

关于第一列标题的顺序也可以优化,目前就不做了,自己可以选择性优化一下。

另外如果数据量很大不要使用XSSFWorkBook ,建议使用SXSSFWorkBook。XSSFWorkBook对于内存的耗费特别严重,关于SXXFWorkBook的用法可以查看官方文档

 

 

2018-01-22 09:29:41 huangchunxia_1 阅读数 4139
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1263 人正在学习 去看看 钟林森

转载自:http://bbs.chinaunix.net/thread-3620272-1-1.html

说明:我的电脑 2.0CPU 2G内存 能够十秒钟导出 20W 条数据 ,12.8M的excel内容压缩后2.68M
我们知道在POI导出Excel时,数据量大了,很容易导致内存溢出。由于Excel 一个sheet允许的最大行数是65536这时我们想到分sheet进行导出;但是这种情况也不能解决内存溢出的问题。毕竟数据还是一次性在内存中进行保存的。这时我们想是不是可以导出多个excel呢?下面我就尝试着按照导出多个excel
首先:我们要确定数据量有多大,然后确定一个excel导出多少条数据,这样就可以确定导出的Excel的数量,于是我们就可以循环的导出excel并保存在任意的临时目录中。去这样如果内存不够的话虚拟机就会去进行回收已经保存的excel在内存中的空间。
假设我们我们已经成功的生成了多个excel,这时我们怎么把这N个excel文档传到客户端呢?其实一个一个的传也未尝不可,但是考虑那样对用户来说体验不够好,再次多个文件在网络上传输也比较慢。我们可以考虑对生成的几个文件进行压缩,然后传到客户端。
总结一下第一、分批次生成excel第二、压缩后到客户端

下面我把我的一个小实例贴上供大家参考

第一、Person.java 普通javabean

Javabean代码

  1. package bean;  
  2. /**  
  3. *   
  4. * @author QQ:三二8二4七6七六  
  5. *  
  6. */  
  7. public class Person {  
  8.   
  9.     private Integer id;  
  10.     private String name;  
  11.     private String address;  
  12.     private String tel;  
  13.     private Double money=0.0;  
  14.     public Double getMoney() {  
  15.         return money;  
  16.     }  
  17.     public void setMoney(Double money) {  
  18.         this.money = money;  
  19.     }  
  20.     public Person(Integer id, String name, String address, String tel,Double money) {  
  21.         super();  
  22.         this.id = id;  
  23.         this.name = name;  
  24.         this.address = address;  
  25.         this.tel = tel;  
  26.         this.money=money;  
  27.     }  
  28.     public Integer getId() {  
  29.         return id;  
  30.     }  
  31.     public void setId(Integer id) {  
  32.         this.id = id;  
  33.     }  
  34.     public String getName() {  
  35.         return name;  
  36.     }  
  37.     public void setName(String name) {  
  38.         this.name = name;  
  39.     }  
  40.     public String getAddress() {  
  41.         return address;  
  42.     }  
  43.     public void setAddress(String address) {  
  44.         this.address = address;  
  45.     }  
  46.     public String getTel() {  
  47.         return tel;  
  48.     }  
  49.     public void setTel(String tel) {  
  50.         this.tel = tel;  
  51.     }  
  52. }  
复制代码
第二、PersonService模拟业务逻辑循环生成100023个Person对象

模拟业务逻辑代码
  1. package service;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import bean.Person;  
  7. /**  
  8. *   
  9. * @author QQ:三二8二4七6七六  
  10. *  
  11. */  
  12. public class PersonService {  
  13.     public static List getPerson(){  
  14.         List<Person> list =new ArrayList<Person>();  
  15.         for(int i=0;i<100320;i++){  
  16.             list.add(new Person(i,"zhangsan"+i,"北京"+i,"13214587632",123123.12+i));   
  17.         }  
  18.         return list;  
  19.     }  
  20.   
  21. }  
复制代码
第三、业务处理Servlet

操作servlet代码
  1. package servlet;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.OutputStream;  
  8. import java.text.SimpleDateFormat;  
  9. import java.util.ArrayList;  
  10. import java.util.Date;  
  11. import java.util.List;  
  12.   
  13. import javax.servlet.ServletException;  
  14. import javax.servlet.http.HttpServlet;  
  15. import javax.servlet.http.HttpServletRequest;  
  16. import javax.servlet.http.HttpServletResponse;  
  17.   
  18. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  19. import org.apache.poi.hssf.util.CellRangeAddress;  
  20. import org.apache.poi.ss.usermodel.Cell;  
  21. import org.apache.poi.ss.usermodel.CellStyle;  
  22. import org.apache.poi.ss.usermodel.Row;  
  23. import org.apache.poi.ss.usermodel.Sheet;  
  24. import org.apache.poi.ss.usermodel.Workbook;  
  25.   
  26. import bean.Person;  
  27.   
  28. import service.PersonService;  
  29.   
  30. /**  
  31. *   
  32. * @author QQ:三二8二4七6七六  
  33. *   
  34. */  
  35. public class PersonServlet extends HttpServlet {  
  36.     private String fileName;  
  37.   
  38.     public PersonServlet() {  
  39.         super();  
  40.     }  
  41.   
  42.     public void destroy() {  
  43.         super.destroy(); // Just puts "destroy" string in log  
  44.         // Put your code here  
  45.     }  
  46.   
  47.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  48.             throws ServletException, IOException {  
  49.         // 文件名获取  
  50.         Date date = new Date();  
  51.         SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");  
  52.         String f = "Person-" + format.format(date);  
  53.         this.fileName = f;  
  54.         setResponseHeader(response);  
  55.         OutputStream out = null;  
  56.         try {  
  57.             out = response.getOutputStream();  
  58.             List<Person> list = PersonService.getPerson();  
  59.             toExcel(list,request,10000,f,out);  
  60.         } catch (IOException e1) {  
  61.             e1.printStackTrace();  
  62.         } finally {  
  63.             try {  
  64.                 out.flush();  
  65.                 out.close();  
  66.             } catch (IOException e) {  
  67.                 e.printStackTrace();  
  68.             }  
  69.         }  
  70.     }  
  71.   
  72.     /** 设置响应头 */  
  73.     public void setResponseHeader(HttpServletResponse response) {  
  74.         try {  
  75.             response.setContentType("application/octet-stream;charset=UTF-8");  
  76.             response.setHeader("Content-Disposition", "attachment;filename="  
  77.                     + java.net.URLEncoder.encode(this.fileName, "UTF-8")  
  78.                     + ".zip");  
  79.             response.addHeader("Pargam", "no-cache");  
  80.             response.addHeader("Cache-Control", "no-cache");  
  81.         } catch (Exception ex) {  
  82.             ex.printStackTrace();  
  83.         }  
  84.     }  
  85.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  86.             throws ServletException, IOException {  
  87.   
  88.         doGet(request, response);  
  89.     }  
  90.     public void init() throws ServletException {  
  91.         // Put your code here  
  92.     }  
  93.   
  94.     public void toExcel(List<Person> list, HttpServletRequest request,  
  95.             int length, String f, OutputStream out) throws IOException {  
  96.         List<String> fileNames = new ArrayList();// 用于存放生成的文件名称s  
  97.         File zip = new File(request.getRealPath("/files") + "/" + f + ".zip");// 压缩文件  
  98.         // 生成excel  
  99.         for (int j = 0, n = list.size() / length + 1; j < n; j++) {  
  100.             Workbook book = new HSSFWorkbook();  
  101.             Sheet sheet = book.createSheet("person");  
  102.   
  103.             double d = 0;// 用来统计  
  104.             String file = request.getRealPath("/files") + "/" + f + "-" + j  
  105.                     + ".xls";  
  106.   
  107.             fileNames.add(file);  
  108.             FileOutputStream o = null;  
  109.             try {  
  110.                 o = new FileOutputStream(file);  
  111.   
  112.                 // sheet.addMergedRegion(new  
  113.                 // CellRangeAddress(list.size()+1,0,list.size()+5,6));  
  114.                 Row row = sheet.createRow(0);  
  115.                 row.createCell(0).setCellValue("ID");  
  116.                 row.createCell(1).setCellValue("NAME");  
  117.                 row.createCell(2).setCellValue("ADDRESS");  
  118.                 row.createCell(3).setCellValue("TEL");  
  119.                 row.createCell(4).setCellValue("Money");  
  120.   
  121.                 int m = 1;  
  122.   
  123.                 for (int i = 1, min = (list.size() - j * length + 1) > (length + 1) ? (length + 1)  
  124.                         : (list.size() - j * length + 1); i < min; i++) {  
  125.                     m++;  
  126.                     Person user = list.get(length * (j) + i - 1);  
  127.                     Double dd = user.getMoney();  
  128.                     if (dd == null) {  
  129.                         dd = 0.0;  
  130.                     }  
  131.                     d += dd;  
  132.                     row = sheet.createRow(i);  
  133.                     row.createCell(0).setCellValue(user.getId());  
  134.                     row.createCell(1).setCellValue(user.getName());  
  135.                     row.createCell(2).setCellValue(user.getAddress());  
  136.                     row.createCell(3).setCellValue(user.getTel());  
  137.                     row.createCell(4).setCellValue(dd);  
  138.   
  139.                 }  
  140.                 CellStyle cellStyle2 = book.createCellStyle();  
  141.                 cellStyle2.setAlignment(CellStyle.ALIGN_CENTER);  
  142.                 row = sheet.createRow(m);  
  143.                 Cell cell0 = row.createCell(0);  
  144.                 cell0.setCellValue("Total");  
  145.                 cell0.setCellStyle(cellStyle2);  
  146.                 Cell cell4 = row.createCell(4);  
  147.                 cell4.setCellValue(d);  
  148.                 cell4.setCellStyle(cellStyle2);  
  149.                 sheet.addMergedRegion(new CellRangeAddress(m, m, 0, 3));  
  150.             } catch (Exception e) {  
  151.                 e.printStackTrace();  
  152.             }  
  153.             try {  
  154.                 book.write(o);  
  155.             } catch (Exception ex) {  
  156.                 ex.printStackTrace();  
  157.             } finally {  
  158.                 o.flush();  
  159.                 o.close();  
  160.             }  
  161.         }  
  162.         File srcfile[] = new File[fileNames.size()];  
  163.         for (int i = 0, n = fileNames.size(); i < n; i++) {  
  164.             srcfile[i] = new File(fileNames.get(i));  
  165.         }  
  166.         util.FileZip.ZipFiles(srcfile, zip);  
  167.         FileInputStream inStream = new FileInputStream(zip);  
  168.         byte[] buf = new byte[4096];  
  169.         int readLength;  
  170.         while (((readLength = inStream.read(buf)) != -1)) {  
  171.             out.write(buf, 0, readLength);  
  172.         }  
  173.         inStream.close();  
  174.     }  
  175. }  
  176. 最后还有个工具类package util;
  177. 压缩工具类代码  
  178. import java.io.FileInputStream;  
  179. import java.io.FileOutputStream;  
  180. import java.io.IOException;  
  181. import java.util.zip.ZipEntry;  
  182. import java.util.zip.ZipOutputStream;  
  183. /**  
  184. *   
  185. * @author QQ:三二8二4七6七六  
  186. *  
  187. */  
  188. public class FileZip {  
  189.     /**  
  190.      *   
  191.      * @param srcfile 文件名数组  
  192.      * @param zipfile 压缩后文件  
  193.      */  
  194.     public static void ZipFiles(java.io.File[] srcfile, java.io.File zipfile) {  
  195.         byte[] buf = new byte[1024];  
  196.         try {  
  197.             ZipOutputStream out = new ZipOutputStream(new FileOutputStream(  
  198.                     zipfile));  
  199.             for (int i = 0; i < srcfile.length; i++) {  
  200.                 FileInputStream in = new FileInputStream(srcfile[i]);  
  201.                 out.putNextEntry(new ZipEntry(srcfile[i].getName()));  
  202.                 int len;  
  203.                 while ((len = in.read(buf)) > 0) {  
  204.                     out.write(buf, 0, len);  
  205.                 }  
  206.                 out.closeEntry();  
  207.                 in.close();  
  208.             }  
  209.             out.close();  
  210.         } catch (IOException e) {  
  211.             e.printStackTrace();  
  212.         }  
  213.     }  
  214. }  

2016-06-05 16:52:50 u010003835 阅读数 15000
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1263 人正在学习 去看看 钟林森

POI 对大数据量的导出是一个难点,这里博主总结了两种处理方式:


方式一,使用高版本的POI,具有内存自动释放的特点。


方式二,将数据导出到多个Excel中,并进行压缩处理,上传到服务器中。




方式一:


POI之前的版本不支持大数据量处理,如果数据过多则经常报OOM错误,有时候调整JVM大小效果也不是太好。3.8版本的POI新出来了SXSSFWorkbook,可以支持大数据量的操作,只是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式。

    3.8版本的POI对excel的导出操作,一般只使用HSSFWorkbook以及SXSSFWorkbook,HSSFWorkbook用来处理较少的数据量,SXSSFWorkbook用来处理大数据量以及超大数据量的导出。
    HSSFWorkbook的使用方法和之前的版本的使用方法一致,这里就不在陈述使用方法了
    SXSSFWorkbook的使用例子如下:
import junit.framework.Assert;
import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook; 
import org.apache.poi.ss.util.CellReference; 
import org.apache.poi.xssf.streaming.SXSSFWorkbook;  
public static void main(String[] args) throws Throwable { 
 Workbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk 
 Sheet sh = wb.createSheet(); 
 for(int rownum = 0; rownum < 100000; rownum++){
 Row row = sh.createRow(rownum); 
 for(int cellnum = 0; cellnum < 10; cellnum++){ 
 Cell cell = row.createCell(cellnum); 
 String address = new CellReference(cell).formatAsString(); 
 cell.setCellValue(address); } 
 }
FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx"); 
 wb.write(out); 
 out.close();
以前还用xml来处理,现在3.8以上就好办了。
原文地址是:http://blog.sina.com.cn/s/blog_68555ee501015xk2.html
apache官网相关内容地址:http://poi.apache.org/spreadsheet/how-to.html#sxssf







方式二:


说明:我的电脑 2.0CPU 2G内存 能够十秒钟导出 20W 条数据 ,12.8M的excel内容压缩后2.68M

我们知道在POI导出Excel时,数据量大了,很容易导致内存溢出。由于Excel 一个sheet允许的最大行数是65536这时我们想到分sheet进行导出;但是这种情况也不能解决内存溢出的问题。毕竟数据还是一次性在内存中进行保存的。这时我们想是不是可以导出多个excel呢?下面我就尝试着按照导出多个excel

首先:我们要确定数据量有多大,然后确定一个excel导出多少条数据,这样就可以确定导出的Excel的数量,于是我们就可以循环的导出excel并保存在任意的临时目录中。去这样如果内存不够的话虚拟机就会去进行回收已经保存的excel在内存中的空间。

假设我们我们已经成功的生成了多个excel,这时我们怎么把这N个excel文档传到客户端呢?其实一个一个的传也未尝不可,但是考虑那样对用户来说体验不够好,再次多个文件在网络上传输也比较慢。我们可以考虑对生成的几个文件进行压缩,然后传到客户端。

总结一下

第一、分批次生成excel

第二、压缩后到客户端

 

下面我把我的一个小实例贴上供大家参考

 

第一、Person.java 普通javabean

 

Javabean代码  收藏代码
  1. package bean;  
  2. /**  
  3.  *   
  4.  * @author http://javaflex.iteye.com/  
  5.  *  
  6.  */  
  7. public class Person {  
  8.   
  9.     private Integer id;  
  10.     private String name;  
  11.     private String address;  
  12.     private String tel;  
  13.     private Double money=0.0;  
  14.     public Double getMoney() {  
  15.         return money;  
  16.     }  
  17.     public void setMoney(Double money) {  
  18.         this.money = money;  
  19.     }  
  20.     public Person(Integer id, String name, String address, String tel,Double money) {  
  21.         super();  
  22.         this.id = id;  
  23.         this.name = name;  
  24.         this.address = address;  
  25.         this.tel = tel;  
  26.         this.money=money;  
  27.     }  
  28.     public Integer getId() {  
  29.         return id;  
  30.     }  
  31.     public void setId(Integer id) {  
  32.         this.id = id;  
  33.     }  
  34.     public String getName() {  
  35.         return name;  
  36.     }  
  37.     public void setName(String name) {  
  38.         this.name = name;  
  39.     }  
  40.     public String getAddress() {  
  41.         return address;  
  42.     }  
  43.     public void setAddress(String address) {  
  44.         this.address = address;  
  45.     }  
  46.     public String getTel() {  
  47.         return tel;  
  48.     }  
  49.     public void setTel(String tel) {  
  50.         this.tel = tel;  
  51.     }  
  52. }  

 

第二、PersonService模拟业务逻辑循环生成100023个Person对象

 

模拟业务逻辑代码  收藏代码
  1. package service;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import bean.Person;  
  7. /**  
  8.  *   
  9.  * @author http://javaflex.iteye.com/  
  10.  *  
  11.  */  
  12. public class PersonService {  
  13.     public static List getPerson(){  
  14.         List<Person> list =new ArrayList<Person>();  
  15.         for(int i=0;i<100320;i++){  
  16.             list.add(new Person(i,"zhangsan"+i,"北京"+i,"13214587632",123123.12+i));    
  17.         }  
  18.         return list;  
  19.     }  
  20.   
  21. }  

 

 第三、业务处理Servlet

 

操作servlet代码  收藏代码
  1. package servlet;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.OutputStream;  
  8. import java.text.SimpleDateFormat;  
  9. import java.util.ArrayList;  
  10. import java.util.Date;  
  11. import java.util.List;  
  12.   
  13. import javax.servlet.ServletException;  
  14. import javax.servlet.http.HttpServlet;  
  15. import javax.servlet.http.HttpServletRequest;  
  16. import javax.servlet.http.HttpServletResponse;  
  17.   
  18. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  19. import org.apache.poi.hssf.util.CellRangeAddress;  
  20. import org.apache.poi.ss.usermodel.Cell;  
  21. import org.apache.poi.ss.usermodel.CellStyle;  
  22. import org.apache.poi.ss.usermodel.Row;  
  23. import org.apache.poi.ss.usermodel.Sheet;  
  24. import org.apache.poi.ss.usermodel.Workbook;  
  25.   
  26. import bean.Person;  
  27.   
  28. import service.PersonService;  
  29.   
  30. /**  
  31.  *   
  32.  * @author http://javaflex.iteye.com/  
  33.  *  
  34.  */  
  35. public class PersonServlet extends HttpServlet {  
  36.     private String fileName;  
  37.   
  38.     public PersonServlet() {  
  39.         super();  
  40.     }  
  41.   
  42.     public void destroy() {  
  43.         super.destroy(); // Just puts "destroy" string in log  
  44.         // Put your code here  
  45.     }  
  46.   
  47.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  48.             throws ServletException, IOException {  
  49.         // 文件名获取  
  50.         Date date = new Date();  
  51.         SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");  
  52.         String f = "Person-" + format.format(date);  
  53.         this.fileName = f;  
  54.         setResponseHeader(response);  
  55.         OutputStream out = null;  
  56.         try {  
  57.             out = response.getOutputStream();  
  58.             List<Person> list = PersonService.getPerson();  
  59.             toExcel(list,request,10000,f,out);  
  60.         } catch (IOException e1) {  
  61.             e1.printStackTrace();  
  62.         } finally {  
  63.             try {  
  64.                 out.flush();  
  65.                 out.close();  
  66.             } catch (IOException e) {  
  67.                 e.printStackTrace();  
  68.             }  
  69.         }  
  70.     }  
  71.   
  72.     /** 设置响应头 */  
  73.     public void setResponseHeader(HttpServletResponse response) {  
  74.         try {  
  75.             response.setContentType("application/octet-stream;charset=UTF-8");  
  76.             response.setHeader("Content-Disposition""attachment;filename="  
  77.                     + java.net.URLEncoder.encode(this.fileName, "UTF-8")  
  78.                     + ".zip");  
  79.             response.addHeader("Pargam""no-cache");  
  80.             response.addHeader("Cache-Control""no-cache");  
  81.         } catch (Exception ex) {  
  82.             ex.printStackTrace();  
  83.         }  
  84.     }  
  85.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  86.             throws ServletException, IOException {  
  87.   
  88.         doGet(request, response);  
  89.     }  
  90.     public void init() throws ServletException {  
  91.         // Put your code here  
  92.     }  
  93.   
  94.     public void toExcel(List<Person> list, HttpServletRequest request,  
  95.             int length, String f, OutputStream out) throws IOException {  
  96.         List<String> fileNames = new ArrayList();// 用于存放生成的文件名称s  
  97.         File zip = new File(request.getRealPath("/files") + "/" + f + ".zip");// 压缩文件  
  98.         // 生成excel  
  99.         for (int j = 0, n = list.size() / length + 1; j < n; j++) {  
  100.             Workbook book = new HSSFWorkbook();  
  101.             Sheet sheet = book.createSheet("person");  
  102.   
  103.             double d = 0;// 用来统计  
  104.             String file = request.getRealPath("/files") + "/" + f + "-" + j  
  105.                     + ".xls";  
  106.   
  107.             fileNames.add(file);  
  108.             FileOutputStream o = null;  
  109.             try {  
  110.                 o = new FileOutputStream(file);  
  111.   
  112.                 // sheet.addMergedRegion(new  
  113.                 // CellRangeAddress(list.size()+1,0,list.size()+5,6));  
  114.                 Row row = sheet.createRow(0);  
  115.                 row.createCell(0).setCellValue("ID");  
  116.                 row.createCell(1).setCellValue("NAME");  
  117.                 row.createCell(2).setCellValue("ADDRESS");  
  118.                 row.createCell(3).setCellValue("TEL");  
  119.                 row.createCell(4).setCellValue("Money");  
  120.   
  121.                 int m = 1;  
  122.   
  123.                 for (int i = 1, min = (list.size() - j * length + 1) > (length + 1) ? (length + 1)  
  124.                         : (list.size() - j * length + 1); i < min; i++) {  
  125.                     m++;  
  126.                     Person user = list.get(length * (j) + i - 1);  
  127.                     Double dd = user.getMoney();  
  128.                     if (dd == null) {  
  129.                         dd = 0.0;  
  130.                     }  
  131.                     d += dd;  
  132.                     row = sheet.createRow(i);  
  133.                     row.createCell(0).setCellValue(user.getId());  
  134.                     row.createCell(1).setCellValue(user.getName());  
  135.                     row.createCell(2).setCellValue(user.getAddress());  
  136.                     row.createCell(3).setCellValue(user.getTel());  
  137.                     row.createCell(4).setCellValue(dd);  
  138.   
  139.                 }  
  140.                 CellStyle cellStyle2 = book.createCellStyle();  
  141.                 cellStyle2.setAlignment(CellStyle.ALIGN_CENTER);  
  142.                 row = sheet.createRow(m);  
  143.                 Cell cell0 = row.createCell(0);  
  144.                 cell0.setCellValue("Total");  
  145.                 cell0.setCellStyle(cellStyle2);  
  146.                 Cell cell4 = row.createCell(4);  
  147.                 cell4.setCellValue(d);  
  148.                 cell4.setCellStyle(cellStyle2);  
  149.                 sheet.addMergedRegion(new CellRangeAddress(m, m, 03));  
  150.             } catch (Exception e) {  
  151.                 e.printStackTrace();  
  152.             }  
  153.             try {  
  154.                 book.write(o);  
  155.             } catch (Exception ex) {  
  156.                 ex.printStackTrace();  
  157.             } finally {  
  158.                 o.flush();  
  159.                 o.close();  
  160.             }  
  161.         }  
  162.         File srcfile[] = new File[fileNames.size()];  
  163.         for (int i = 0, n = fileNames.size(); i < n; i++) {  
  164.             srcfile[i] = new File(fileNames.get(i));  
  165.         }  
  166.         util.FileZip.ZipFiles(srcfile, zip);  
  167.         FileInputStream inStream = new FileInputStream(zip);  
  168.         byte[] buf = new byte[4096];  
  169.         int readLength;  
  170.         while (((readLength = inStream.read(buf)) != -1)) {  
  171.             out.write(buf, 0, readLength);  
  172.         }  
  173.         inStream.close();  
  174.     }  
  175. }  

最后还有个工具类package util;

压缩工具类代码  收藏代码
  1. import java.io.FileInputStream;  
  2. import java.io.FileOutputStream;  
  3. import java.io.IOException;  
  4. import java.util.zip.ZipEntry;  
  5. import java.util.zip.ZipOutputStream;  
  6. /**  
  7.  *   
  8.  * @author http://javaflex.iteye.com/  
  9.  *  
  10.  */  
  11. public class FileZip {  
  12.     /**  
  13.      *   
  14.      * @param srcfile 文件名数组  
  15.      * @param zipfile 压缩后文件  
  16.      */  
  17.     public static void ZipFiles(java.io.File[] srcfile, java.io.File zipfile) {  
  18.         byte[] buf = new byte[1024];  
  19.         try {  
  20.             ZipOutputStream out = new ZipOutputStream(new FileOutputStream(  
  21.                     zipfile));  
  22.             for (int i = 0; i < srcfile.length; i++) {  
  23.                 FileInputStream in = new FileInputStream(srcfile[i]);  
  24.                 out.putNextEntry(new ZipEntry(srcfile[i].getName()));  
  25.                 int len;  
  26.                 while ((len = in.read(buf)) > 0) {  
  27.                     out.write(buf, 0, len);  
  28.                 }  
  29.                 out.closeEntry();  
  30.                 in.close();  
  31.             }  
  32.             out.close();  
  33.         } catch (IOException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.     }  
  37. }  

OK全部内容完成



 

12.8M的excel内容压缩后2.68M,给力吧

以后记得代码加注释

 

亲,记得给个评论哦

  • 大小: 4.4 KB
  • 大小: 2.5 KB
  • POI.rar (5.7 MB)
  • 下载次数: 1449
2018-12-07 14:10:57 lqz1993 阅读数 36
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1263 人正在学习 去看看 钟林森

package com.zhwg.core.dao.utile.excel;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;

import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.RegionUtil;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.zhwg.core.tool.ZipUtil;

public class ExcelUtils {

private static Logger logger = LoggerFactory.getLogger(ExcelUtils.class);
private CellStyle cellStyle;
int writeLine = 1;

/**
 * 字号
 */
private static final int FONT_SIZE = 8;

/**
 * 导出到excel文件,默认的sheet名称
 */
private static final String DEFAULT_SHEET_NAME = "Sheet1";

/**
 * 列宽
 */
private static final int WIDTH_COL = 16;

public static void main(String[] args) {
	String[] title = { "第1列", "第2列", "第3列", "第4列", "第5列", "第6列", "第7列" };
	List<String[]> contents = new ArrayList<String[]>();
	for (int i = 0; i < 10; i ++) {
		contents.add(new String[] {"第" + i + "行第1列", "第" + i + "行第2列", "第" + i + "行第3列", "第" + i + "行第4列", "第" + i + "行第5列", "第" + i + "行第6列", "第" + i + "行第7列"});
	}
	new ExcelUtils().exportToExcel(title, contents);
}

/**
 * 
 * @description 将数据导出为excel文件
 *
 * @author chj
 * @date 2013-2-19
 * @time 上午11:38:38
 * 
 * @param titles 表头
 * @param contents 表内容
 * @return 导出的excel文件
 */
public File exportToExcel(String[] titles, List<String[]> contents) {
	WritableWorkbook workbook = null;
	File tempDir = new File("test");
	if (!tempDir.exists()){
		tempDir.mkdirs();
	}
	// 防止文件重名
	File file = new File("temp" + Calendar.getInstance().getTime().getTime() + ".xls");
    try {
        workbook = Workbook.createWorkbook(file);
        WritableSheet sheet = workbook.createSheet(DEFAULT_SHEET_NAME, 0);
        initGridSize(sheet, titles.length, WIDTH_COL);
        initTitle(sheet, titles);
        if (contents != null && contents.size() > 0) {
        	for (int i = 0; i < contents.size(); i++) {
        		writeLineContent(sheet, contents.get(i));
        	}
        }
		workbook.write();
    } catch (Exception e) {
    	logger.error(e.getMessage(),e);
    } finally {
        closeWritableWorkbook(workbook);
    }
    return file;
}

/**
 * 
 * @description 将数据导出为excel文件
 *
 * @author chj
 * @date 2013-2-19
 * @time 下午01:31:20
 * 
 * @param titles 表头
 * @param contents 表内容
 * @return 导出的excel文件
 */
public File exportToExcel(List<String> titles, List<List<String>> contents) {
	WritableWorkbook workbook = null;
	// 防止文件重名
	File file = new File("temp" + Calendar.getInstance().getTime().getTime() + ".xls");
	try {
		workbook = Workbook.createWorkbook(file);
		WritableSheet sheet = workbook.createSheet(DEFAULT_SHEET_NAME, 0);
		initGridSize(sheet, titles.size(), WIDTH_COL);
		String[] titleTemp = (String[]) titles.toArray();
		initTitle(sheet, titleTemp);
		if (contents != null && contents.size() > 0) {
			for (int i = 0; i < contents.size(); i++) {
				writeLineContent(sheet, contents.get(i));
			}
		}
		workbook.write();
	} catch (Exception e) {
		logger.error(e.getMessage(),e);
	} finally {
		closeWritableWorkbook(workbook);
	}
	return file;
}

/**
 * 把告警信息写入excel表
 * 
 * @param excel
 * @param trapList
 * @return
 */
public boolean exportToExcel(String userName, File excel) {
    WritableWorkbook workbook = null;
    try {
        workbook = Workbook.createWorkbook(excel);
        WritableSheet sheet = workbook.createSheet(DEFAULT_SHEET_NAME, 0);
        initGridSize(sheet);
        initTitle(sheet, new String[] { userName, "", ""});
        initTitle(sheet, new String[] { "第1列", "第2列", "第3列", "第4列", "第5列", "第6列", "第7列" });
        String[] values = new String[] { "1", "2", "3", "4", "5", "6", "7", };
        writeLineContent(sheet, values);
        workbook.write();
    } catch (Exception e) {
        return false;
    } finally {
        closeWritableWorkbook(workbook);
    }
    return true;
}

private void closeWritableWorkbook(WritableWorkbook rwb) {
    if (null != rwb) {
        try {
            rwb.close();
        } catch (WriteException e) {
            logger.warn("can not close the excel workbook", e);
        } catch (IOException e) {
            logger.warn("can not close the excel workbook", e);
        }
    }
}



/**
 * 初始化表格尺寸
 * 
 * @param sheet
 * @throws RowsExceededException
 */
private static void initGridSize(WritableSheet sheet) throws RowsExceededException {

    sheet.setColumnView(0, WIDTH_COL);
    sheet.setColumnView(1, WIDTH_COL);
    sheet.setColumnView(2, WIDTH_COL);
    sheet.setColumnView(3, WIDTH_COL);
    sheet.setColumnView(4, WIDTH_COL);
    sheet.setColumnView(5, WIDTH_COL);
    sheet.setColumnView(6, WIDTH_COL);
    sheet.setColumnView(7, WIDTH_COL);
    sheet.setColumnView(8, WIDTH_COL);
    sheet.setColumnView(9, WIDTH_COL);
    sheet.setColumnView(10, WIDTH_COL);
}

/**
 * 
 * @description
 *
 * @author chj
 * @date 2013-2-19
 * @time 上午11:06:42
 * 
 * @param sheet excel表
 * @param colSize 列数
 * @param width 列宽
 * @throws RowsExceededException
 */
private static void initGridSize(WritableSheet sheet, int colSize, int width) throws RowsExceededException {
	for (int i = 0; i < colSize; i++) {
		sheet.setColumnView(i, width);
	}
}

/**
 * 初始化标题栏
 * 
 * @param sheet
 * @throws WriteException
 * @throws RowsExceededException
 */
private void initTitle(WritableSheet sheet, String[] titles) throws WriteException {
    WritableCellFormat wcf = getCellTitleFormat();
    int i = 0;
    for (String title : titles) {
        sheet.addCell(new Label(i, writeLine, title, wcf));
        i++;
    }
    writeLine += 2;

}

/**
 * 获得标题栏格式
 * 
 * @return
 * @throws WriteException
 */
private WritableCellFormat getCellTitleFormat() throws WriteException {
    WritableCellFormat wcf = getBasicCellFormat();
    wcf.setBackground(Colour.GREY_25_PERCENT);
    return wcf;
}

/**
 * 初始化单元格基本格式
 * 
 * @param wcf_center
 * @throws WriteException
 */
private WritableCellFormat getBasicCellFormat() throws WriteException {
    WritableCellFormat wcf = new WritableCellFormat();
    WritableFont font = new WritableFont(WritableFont.ARIAL, FONT_SIZE);
    wcf.setFont(font);
    wcf.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
    wcf.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐
    wcf.setAlignment(Alignment.CENTRE);
    wcf.setWrap(true); // 是否换行
    return wcf;
}

/**
 * 向excel表格中写入一行内容
 * 
 * @param userList
 * @param sheet
 * @throws WriteException
 * @throws RowsExceededException
 */
private void writeLineContent(WritableSheet sheet, String[] values) throws WriteException {
    WritableCellFormat wcf = getBasicCellFormat();
    int i = 0;
    for (String value : values) {
        sheet.addCell(new Label(i, writeLine, value, wcf));
        i++;
    }
    if (values.length<=1) {
		sheet.mergeCells(0, writeLine, sheet.getColumns()-1, writeLine); // 合并单元格  
	}
    writeLine = writeLine + 1;
}

/**
 * 
 * @description 向excel表格中写入一行内容
 *
 * @author chj
 * @date 2013-2-19
 * @time 下午01:29:45
 * 
 * @param sheet
 * @param values
 * @throws WriteException
 */
private void writeLineContent(WritableSheet sheet, List<String> values) throws WriteException {
	WritableCellFormat wcf = getBasicCellFormat();
	int i = 0;
	for (String value : values) {
		sheet.addCell(new Label(i, writeLine, value, wcf));
		i++;
	}
	writeLine = writeLine + 1;
}

/**
 * 获取文件路径
 * 
 * @param folderName
 * @return
 */
public static String getFolderPath(String folderName) {
	File classFile = new File(getClassPath());
	String tempFileStr = classFile.getParentFile().getParent()
			+ File.separator + folderName;
	File tempFile = new File(tempFileStr);
	if (!tempFile.exists() || !tempFile.isDirectory()) {
		if (tempFile.mkdirs()) {
			return tempFileStr;
		} else {
			return "";
		}
	}
	return tempFileStr;
}

/**
 * 获取系统文件classpath路径
 * 
 * @return
 */
public static String getClassPath() {
	return ExcelUtils.class.getClassLoader().getResource("").getFile()
			.replaceAll("%20", " ");
}
/**
 * 向一个单元格写入值//复制sheet(0)
 * 
 * @param sheetNum
 *            sheet的编号
 * @param rowNum
 *            行号
 * @param columnNum
 *            列号
 * @param value
 *            写入的值
 * @throws Exception
 */
public void writeToExcel(HSSFWorkbook workbook ,int sheetNum, int rowNum, int columnNum,
		Object value) throws Exception {
	try {
		HSSFSheet sheet = workbook.getSheetAt(sheetNum);
		HSSFRow row = sheet.getRow(rowNum);
		if (null == row) {
			row = sheet.createRow(rowNum);
		}
		HSSFCell cell = row.getCell(columnNum);
		if (cell == null) {
			cell = row.createCell(columnNum);
		}
		cell.setCellValue(convertString(value));
	} catch (Exception e) {
		logger.error(e.getMessage(),e);
	} finally {
	}
}

public void writeToExcel(XSSFWorkbook workbook ,int sheetNum, int rowNum, int columnNum, Object value) throws Exception {
	try {
		XSSFSheet sheet = workbook.getSheetAt(sheetNum);
		XSSFRow row = sheet.getRow(rowNum);
		if (null == row) {
			row = sheet.createRow(rowNum);
		}
		XSSFCell cell = row.getCell(columnNum);
		if (cell == null) {
			cell = row.createCell(columnNum);
		}
		cell.setCellValue(convertString(value));
	} catch (Exception e) {
		logger.error(e.getMessage(),e);
	} finally {
	}
}

public void createPicture(int dx1,int dy1,int dx2,int dy2,short col1,int row1,short col2,int row2,
		HSSFPatriarch patriarch,String path,HSSFWorkbook wb) throws Exception {
	//anchor主要用于设置图片的属性
    /*关于HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)的参数,有必要在这里说明一下:
    dx1:起始单元格的x偏移量,例如255表示直线起始位置距A1单元格左侧的距离;
    dy1:起始单元格的y偏移量,例如125表示直线起始位置距A1单元格上侧的距离;
    dx2:终止单元格的x偏移量,例如1023表示直线起始位置距C3单元格左侧的距离;
    dy2:终止单元格的y偏移量,例如150表示直线起始位置距C3单元格上侧的距离;
    col1:起始单元格列序号,从0开始计算;
    row1:起始单元格行序号,从0开始计算,例如col1=0,row1=0就表示起始单元格为A1;
    col2:终止单元格列序号,从0开始计算;
    row2:终止单元格行序号,从0开始计算,例如col2=2,row2=2就表示起始单元格为C3;*/
    HSSFClientAnchor anchor = new HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2);
	//先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray    
	ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();  
	File file = new File(path);
	if(file.isFile() && !file.isDirectory()){
		BufferedImage input = ImageIO.read(file);
		ImageIO.write(input, "png", byteArrayOut);
		//插入图片    
		patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG));
	}
}

/**
 * 向一个单元格写入值//复制sheet(0)
 * 
 * @param sheetNum
 *            sheet的编号
 * @param rowNum
 *            行号
 * @param columnNum
 *            列号
 * @param value
 *            写入的值
 * @throws Exception
 */
public  void writeToExcelStyle(HSSFWorkbook workbook ,int sheetNum, int rowNum, int columnNum,
		Object value,HSSFCellStyle style) throws Exception {
	try {
		HSSFSheet sheet = workbook.getSheetAt(sheetNum);
		HSSFRow row = sheet.getRow(rowNum);
		if (null == row) {
			row = sheet.createRow(rowNum);
		}
		HSSFCell cell = row.getCell(columnNum);
		if (cell == null) {
			cell = row.createCell(columnNum);
		}
		cell.setCellValue(convertString(value));
		cell.setCellStyle(style);
	} catch (Exception e) {
		logger.error(e.getMessage(),e);
	} finally {
	}
}
/**
 * 向一个单元格写入值//复制sheet(0)
 * 
 * @param sheetNum
 *            sheet的编号
 * @param rowNum
 *            行号
 * @param columnNum
 *            列号
 * @param value
 *            写入的值
 * @throws Exception
 */
public  void writeToExcelStyle(XSSFWorkbook workbook ,int sheetNum, int rowNum, int columnNum,
		Object value,short alignStyle) throws Exception {
	try {
		XSSFSheet sheet = workbook.getSheetAt(sheetNum);
		XSSFRow row = sheet.getRow(rowNum);
		if (null == row) {
			row = sheet.createRow(rowNum);
		}
		XSSFCell cell = row.getCell(columnNum);
		if (cell == null) {
			cell = row.createCell(columnNum);
		}
		cell.setCellValue(convertString(value));
		
		setCellStyle(workbook, alignStyle, CellStyle.VERTICAL_CENTER);
		cell.setCellStyle(cellStyle);
	} catch (Exception e) {
		logger.error(e.getMessage(),e);
	} finally {
	}
}

public String convertString(Object value) {
	if (value == null) {
		return "";
	} else {
		return value.toString();
	}
}
/**
 * 设置单元格
 * @param workbook
 * @param alignStyle //水平对其方式
 * @param verticalAlignment//垂直对其方式
 */
public void setCellStyle(XSSFWorkbook workbook,short alignStyle,short verticalAlignment){
	cellStyle = workbook.createCellStyle();
	cellStyle.setBorderTop(CellStyle.BORDER_THIN);//上边框
	cellStyle.setBorderBottom(CellStyle.BORDER_THIN);//下边框
	cellStyle.setBorderLeft(CellStyle.BORDER_THIN);//左边框
	cellStyle.setBorderRight(CellStyle.BORDER_THIN);//右边框
	cellStyle.setAlignment(alignStyle);//水平对其方式
	cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//垂直对其方式
	cellStyle.setWrapText(true);//自适应高度
}

/**
 * 设置单元格
 * @param workbook
 * @param alignStyle //水平对其方式
 * @param verticalAlignment//垂直对其方式
 */
public void setCellStyle(HSSFWorkbook workbook,short alignStyle,short verticalAlignment){
	cellStyle = workbook.createCellStyle();
	cellStyle.setBorderTop(CellStyle.BORDER_THIN);//上边框
	cellStyle.setBorderBottom(CellStyle.BORDER_THIN);//下边框
	cellStyle.setBorderLeft(CellStyle.BORDER_THIN);//左边框
	cellStyle.setBorderRight(CellStyle.BORDER_THIN);//右边框
	cellStyle.setAlignment(alignStyle);//水平对其方式
	cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//垂直对其方式
	cellStyle.setWrapText(true);//自适应高度
}

/**设置合并单元格
 * *
 */
public void setRegion(HSSFWorkbook workBook,int sheetId,int rowFrom, short colFrom, int rowTo, short colTo){
	try{
		HSSFSheet sheet = workBook.getSheetAt(sheetId);
		sheet.addMergedRegion(new CellRangeAddress(rowFrom, rowTo, colFrom, colTo));//参数:起始行号,终止行号, 起始列号,终止列号
	}catch (Exception e) {
		logger.error(e.getMessage(),e);
	}
}
public void setRegion(XSSFWorkbook workBook,int sheetId,int rowFrom, short colFrom, int rowTo, short colTo){
	try{
		XSSFSheet sheet = workBook.getSheetAt(sheetId);
		CellRangeAddress address = new CellRangeAddress(rowFrom, rowTo, colFrom, colTo);
		sheet.addMergedRegion(address);//参数:起始行号,终止行号, 起始列号,终止列号
		RegionUtil.setBorderBottom(1, address, sheet);
		RegionUtil.setBorderLeft(1, address, sheet);
		RegionUtil.setBorderRight(1, address, sheet);
		RegionUtil.setBorderTop(1, address, sheet);
		
	}catch (Exception e) {
		logger.error(e.getMessage(),e);
	}
}

/**
 * 设置单元格样式
 */
public void setRowStyle(HSSFWorkbook workBook,int sheetId,int rowFrom, short colFrom, int rowTo, short colTo){
	try{
		setCellStyle(workBook, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);
		
		HSSFSheet sheet = workBook.getSheetAt(sheetId);
		for(int i=0;rowFrom+i<=rowTo;i++ ){
			HSSFRow hssfRow=sheet.getRow(rowFrom+i);
			if(hssfRow!=null){
				
			}else{
				hssfRow=sheet.createRow(colFrom+i);
			}
			for(int j=0; colFrom+j<=colTo; j++ ){
				HSSFCell hssfCell=hssfRow.getCell(colFrom+j);
				if(hssfCell!=null){
					hssfCell.setCellStyle(cellStyle);
				}else{

// hssfRow.createCell(colFrom);
// hssfCell.setCellStyle(cellStyle);
}
}

		}
	}catch (Exception e) {
		logger.error(e.getMessage(),e);
	}
}
public void setRowStyle(XSSFWorkbook workBook,int sheetId,int rowFrom, int colFrom, int rowTo, int colTo){
	try{
		setCellStyle(workBook, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);
		XSSFSheet sheet = workBook.getSheetAt(sheetId);
		for(int i=0;rowFrom+i<=rowTo;i++ ){
			XSSFRow hssfRow = sheet.getRow(rowFrom+i);
			if(hssfRow==null){
				hssfRow = sheet.createRow(colFrom+i);
			}
			for(int j=0; colFrom+j<=colTo; j++ ){
				XSSFCell hssfCell = hssfRow.getCell(colFrom+j);
				if(hssfCell!=null){
					hssfCell.setCellStyle(cellStyle);
				}else{
					hssfRow.createCell(colFrom+j);
					hssfCell = hssfRow.getCell(colFrom+j);
					hssfCell.setCellStyle(cellStyle);
				}
			}
		}
	}catch (Exception e) {
		logger.error(e.getMessage(),e);
	}
}
/**
 * 写入Excel文件并关闭
 * @throws UnsupportedEncodingException 
 */

public void writeAndClose(HSSFWorkbook workBook,HttpServletResponse response, String filename) throws UnsupportedEncodingException {
	// 创建文件输出流,准备输出电子表格
	response.setContentType("text/html;charset=utf-8");
	response.setCharacterEncoding("utf-8");
	response.setContentType("octets/stream");
	response.addHeader("Content-Disposition",
			"attachment;filename="+new String(filename.getBytes("GB2312"), "ISO_8859_1")+"");
	if (workBook != null) {
		try {
			OutputStream out = response.getOutputStream();
			workBook.write(out);
			if (out != null) {
				out.close();
			}
		} catch (Exception e) {
			logger.error(e.getMessage(),e);
		} 
	}
}

public void writeAndClose(XSSFWorkbook workBook,HttpServletResponse response, String filename) throws UnsupportedEncodingException {
	// 创建文件输出流,准备输出电子表格
	response.setContentType("text/html;charset=utf-8");
	response.setCharacterEncoding("utf-8");
	response.setContentType("octets/stream");
	response.addHeader("Content-Disposition",
			"attachment;filename="+new String(filename.getBytes("GB2312"), "ISO_8859_1")+"");
	if (workBook != null) {
		try {
			OutputStream out = response.getOutputStream();
			workBook.write(out);
			if (out != null) {
				out.close();
			}
		} catch (Exception e) {
			logger.error(e.getMessage(),e);
		} 
	}
}

  /** 
 * <b>功能:</b>列头样式<br> 
 * <b>作者:</b>yixq<br> 
 * <b>@param wb 
 * <b>@return</b> 
 */  
public static HSSFCellStyle initColumnHeadStyle(HSSFWorkbook wb) {  
    HSSFCellStyle columnHeadStyle = wb.createCellStyle(); 
    HSSFFont columnHeadFont = wb.createFont();  
    columnHeadFont.setFontName("宋体");  
    columnHeadFont.setFontHeightInPoints((short) 10);  
    columnHeadFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
    columnHeadStyle.setFont(columnHeadFont);  
    columnHeadStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中  
    columnHeadStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中  
    columnHeadStyle.setLocked(true);  
    columnHeadStyle.setWrapText(true);  
    columnHeadStyle.setLeftBorderColor(HSSFColor.BLACK.index);// 左边框的颜色  
    columnHeadStyle.setBorderLeft((short) 1);// 边框的大小  
    columnHeadStyle.setRightBorderColor(HSSFColor.BLACK.index);// 右边框的颜色  
    columnHeadStyle.setBorderRight((short) 1);// 边框的大小  
    columnHeadStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 设置单元格的边框为粗体  
    columnHeadStyle.setBottomBorderColor(HSSFColor.BLACK.index); // 设置单元格的边框颜色  
    // 设置单元格的背景颜色(单元格的样式会覆盖列或行的样式)  
    columnHeadStyle.setFillForegroundColor(HSSFColor.WHITE.index);  
    return columnHeadStyle;  
}

public void exportExcel(XSSFWorkbook workBook,HttpServletResponse response, String fileName, 
		String path,Map<String, String> map,String flag) throws Exception {
	String nFilePath = path  + fileName;//"D:/testZip/test11.xlsx"
	int position = fileName.lastIndexOf(".");
	String zipPath = path + fileName.substring(0,position);//"D:/testZip/test11"
	String zipName =  zipPath + ".zip";//"D:/testZip/test11.zip"
	
	//excel导出到path路径下
	saveExcel(workBook, fileName, path);
	//强制修改后缀名为zip
	ZipUtil.changeFileName(nFilePath,zipName);
	//解压
	ZipUtil.zipToFile(zipName, zipPath);
	//删除压缩文件
	File file = new File(zipName);
	if (file.isFile()) { // 判断是否为文件
		file.delete();
	}
	//替换文件
	if("3-5".equals(flag) || "5-4".equals(flag)){
		if(StringUtils.isNotBlank(map.get("cbrbzr"))){
			ZipUtil.copyFile(map.get("cbrbzr"),zipPath+"/xl/media/image1.png");//承包人业务部门部长
		}
		if(StringUtils.isNotBlank(map.get("jlrshr"))){
			ZipUtil.copyFile(map.get("jlrshr"),zipPath+"/xl/media/image2.png");//专业监理工程师
		}
		if(StringUtils.isNotBlank(map.get("zxrshr"))){
			ZipUtil.copyFile(map.get("zxrshr"),zipPath+"/xl/media/image3.png");//造价咨询工点职员
		}
	}else if("3-3".equals(flag) || "3-4".equals(flag)){
		if(StringUtils.isNotBlank(map.get("cbrxmjl"))){
			ZipUtil.copyFile(map.get("cbrxmjl"),zipPath+"/xl/media/image1.png");//承包人项目经理
		}
		if(StringUtils.isNotBlank(map.get("jlrzgcs"))){
			ZipUtil.copyFile(map.get("jlrzgcs"),zipPath+"/xl/media/image2.png");//总监理工程师
		}
		if(StringUtils.isNotBlank(map.get("zxrfzr"))){
			ZipUtil.copyFile(map.get("zxrfzr"),zipPath+"/xl/media/image3.png");//造价咨询工点项目经理
		}
	}else if("2-4".equals(flag)){
		if(StringUtils.isNotBlank(map.get("bdxmb"))){
			ZipUtil.copyFile(map.get("bdxmb"),zipPath+"/xl/media/image1.png");//标段项目部
		}
		if(StringUtils.isNotBlank(map.get("jldw"))){
			ZipUtil.copyFile(map.get("jldw"),zipPath+"/xl/media/image2.png");//监理单位
		}
		if(StringUtils.isNotBlank(map.get("zxdwr"))){
			ZipUtil.copyFile(map.get("zxdw"),zipPath+"/xl/media/image3.png");//咨询单位
		}
	}
    //压缩
	ZipUtil zip = new ZipUtil(zipName);
	zip.compress(zipPath+"/_rels",zipPath+"/docProps",zipPath+"/xl",zipPath+"/[Content_Types].xml");
	//还原名称
	ZipUtil.changeFileName(zipName, nFilePath);
	
	//导出
	//writeAndClose(workBook, response, fileName);
	//exportExcel(response, fileName, nFilePath);
}

public void exportExcel(String nFilePath,Map<String, String> map,String flag) throws Exception {
	//nFilePath   "D:/testZip/test11.xlsx"
	int position = nFilePath.lastIndexOf(".");
	String zipPath = nFilePath.substring(0,position);//"D:/testZip/test11"
	String zipName =  zipPath + ".zip";//"D:/testZip/test11.zip"
	
	//强制修改后缀名为zip
	ZipUtil.changeFileName(nFilePath,zipName);
	//解压
	ZipUtil.zipToFile(zipName, zipPath);
	//删除压缩文件
	File file = new File(zipName);
	if (file.isFile()) { // 判断是否为文件
		file.delete();
	}
	//替换文件
	if("3-2".equals(flag)){
		if(StringUtils.isNotBlank(map.get("cbrxmjl"))){
			ZipUtil.copyFile(map.get("cbrxmjl"),zipPath+"/xl/media/image1.png");//承包人项目经理
		}
		if(StringUtils.isNotBlank(map.get("jlrzgcs"))){
			ZipUtil.copyFile(map.get("jlrzgcs"),zipPath+"/xl/media/image2.png");//总监理工程师
		}
		if(StringUtils.isNotBlank(map.get("zxrfzr"))){
			ZipUtil.copyFile(map.get("zxrfzr"),zipPath+"/xl/media/image3.png");//造价咨询工点项目经理
		}
	}
    //压缩
	ZipUtil zip = new ZipUtil(zipName);
	zip.compress(zipPath+"/_rels",zipPath+"/docProps",zipPath+"/xl",zipPath+"/[Content_Types].xml");
	//还原名称
	ZipUtil.changeFileName(zipName, nFilePath);
	
	//导出
	//writeAndClose(workBook, response, fileName);
	//exportExcel(response, fileName, nFilePath);
}
/**
 * 2007导出
 * @param response
 * @param filename
 * @param path
 * @throws Exception
 */
public void exportExcel(HttpServletResponse response, String filename,String path)  {
	// 创建文件输出流,准备输出电子表格
	try {
		response.setContentType("text/html;charset=utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("octets/stream");
		response.addHeader("Content-Disposition", "attachment;filename="+new String(filename.getBytes("GB2312"), "ISO_8859_1")+"");
		InputStream fileInStream = new FileInputStream(path);
		XSSFWorkbook workBook = new XSSFWorkbook(fileInStream);
		if (workBook != null) {
			OutputStream out = response.getOutputStream();
			workBook.write(out);
			if (out != null) {
				out.close();
			}
		}
	} catch (Exception e) {
		e.printStackTrace();
		logger.error(e.getMessage(),e);
	} 
}

/**
 * 本地2003导出 
 * @param response
 * @param filename ***test.xls
 * @param path D:/testZip/***test.xls
 * @throws Exception
 */
public void exportExcel2003(HttpServletResponse response, String filename,String path)  {
	// 创建文件输出流,准备输出电子表格
	try {
		response.setContentType("text/html;charset=utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("octets/stream");
		response.addHeader("Content-Disposition", "attachment;filename="+new String(filename.getBytes("GB2312"), "ISO_8859_1")+"");
		InputStream fileInStream = new FileInputStream(path);
		HSSFWorkbook workBook = new HSSFWorkbook(fileInStream);
		if (workBook != null) {
			OutputStream out = response.getOutputStream();
			workBook.write(out);
			if (out != null) {
				out.close();
			}
		}
	} catch (Exception e) {
		e.printStackTrace();
		logger.error(e.getMessage(),e);
	} 
}

public void saveExcel(XSSFWorkbook workBook, String fileName, String path ) {
	if (workBook != null) {
		try {
			createDir(path);
			OutputStream out = new FileOutputStream(path+fileName);
			workBook.write(out);
			if (out != null) {
				out.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}

public boolean createDir(String destDirName){
	File dir = new File(destDirName);
	if (dir.exists()) {// 判断目录是否存在
		System.out.println("创建目录失败,目标目录已存在!");
		return false;
	}
	if (!destDirName.endsWith(File.separator)) {// 结尾是否以"/"结束
		destDirName = destDirName + File.separator;
	}
	if (dir.mkdirs()) {// 创建目标目录
		System.out.println("创建目录成功!" + destDirName);
		return true;
	} else {
		System.out.println("创建目录失败!");
		return false;
	}
}

}

poi大数据导出excel

阅读数 107

没有更多推荐了,返回首页