精华内容
下载资源
问答
  • web项目数据导入导出是非常实用和常见,而excel文件则是十分常见格式。Excel导入——解析已存在的excel文件,并把里面数据一一对应,插入到数据库表中,同时在页面上显示出来。(通常数据库里面会有...

    在web项目中,对数据的导入导出是非常实用和常见的,而excel文件则是十分常见的格式。

    Excel导入——解析已存在的excel文件,并把里面的数据一一对应,插入到数据库表中,同时在页面上显示出来。(通常数据库里面会有一张字段与该excel表头一一对应的表);

    Excel导出——把数据库中的表的数据导出,保存在excel文件中。

    poi相对于jxl,是更为成熟的excel解析技术。这段时间折腾了几天,终于弄清楚了过程,特此记录。

    一些主要的基本概念:poi-3.8-x.jar

    HSSFWokbook——对应excel文件的工作薄

    HSSFSheet——对应excel文件的表空间

    HSSFRow——对应excel文件的表的行

    HSSFCell——对应excel文件的表单元格

    HSSFCellStyle——对应excel文件的表单元格样式

    一、Excel导入(需上传已存在的excel文件)

    已经存在的excel文件:

    jsp页面:

    文件导入:

    导入

    上传的js:

    $.ajaxFileUpload({

    url : "demo/demo-importExcel.json",

    //dataType : 'json',

    secureuri : false,

    fileElementId : 'file',

    success : function(res, status) { //服务器成功响应处理函数

    if (status) {

    //some code

    },

    error : function(res, status, e) {//服务器响应失败处理函数

    alert("导入数据异常:文件导入过程异常。");

    }

    });

    }else{

    alert("导入数据异常:系统只支持Excel模板文件导入,请选择正确的模板文件.");

    return;

    }

    }

    对应的后台:

    @RequestMapping(value = "/demo/demo-importExcel.json")

    @ResponseBody

    public String importExcel( @RequestParam(value = "excelFile") MultipartFile excelFile,HttpServletRequest request) throws BiffException, IOException, KPromptException{

    if (null == excelFile) {

    result = "模板文件为空,请选择文件";

    return result;

    }

    //String path = request.getSession().getServletContext().getRealPath("demo2");

    String path = "E:\\demo";

    //容错处理

    File dir = new File(path);

    if(!dir.exists()) {

    dir.mkdirs();

    }

    String fileName = excelFile.getOriginalFilename();//report.xls

    String fileName2 = excelFile.getName();//excelFile

    InputStream fis = excelFile.getInputStream();

    List> data = ExcelImportUtil..parseExcel(fis);

    //解析到的数据就可以做一些数据库的插入操作了……

    return "success";

    }

    重点来了,excel导入我把它封装成了一个工具方法:

    public class ExcelImportUtil {

    public static List> parseExcel(InputStream fis) {

    List> data = new ArrayList>();;

    try {

    HSSFWorkbook book = new HSSFWorkbook(fis);

    HSSFSheet sheet = book.getSheetAt(0);

    int firstRow = sheet.getFirstRowNum();

    int lastRow = sheet.getLastRowNum();

    //除去表头和第一行

    //ComnDao dao = SysBeans.getComnDao();

    for(int i = firstRow + 1; i

    Map map = new HashMap();

    HSSFRow row = sheet.getRow(i);

    int firstCell = row.getFirstCellNum();

    int lastCell = row.getLastCellNum();

    for(int j=firstCell; j

    HSSFCell cell2 = sheet.getRow(firstRow + 1).getCell(j);

    String key = cell2.getStringCellValue();

    HSSFCell cell = row.getCell(j);

    if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {

    cell.setCellType(HSSFCell.CELL_TYPE_STRING);

    }

    String val = cell.getStringCellValue();

    //System.out.println(val);

    if(i == firstRow + 1) {

    break;

    }else{

    map.put(key, val);

    }

    //System.out.println(map);

    }

    if(i != firstRow + 1) {

    data.add(map);

    System.out.println(map);

    }

    }

    System.out.println(data);

    } catch (IOException e) {

    e.printStackTrace();

    }

    return data;

    }

    }

    可看到数据库中的结果:

    注意:

    1)poi的api读取excel文件时,最常见的两种cell的数据格式是Numeric和String,所以当是数字格式的时候,需要把它的cell type转成String,否则会出现Cannotgetanumericvaluefromatextcell的错误。对应的,设计相应数据库表最好都是Varchar2格式的。

    2)需注意需要解析的只是表的数据,所以表的标题应该不在解析范围内;但表头需要解析,他们对应数据库表里的字段;row和cell的位置都是从0开始,

    二、Excel导出(这里用到了spring的AbstractExcelView)

    首先页面:

    导出

    var exportExcel = function(){

    var url = "demo/demo-exportExcel.json";

    //window.open(url);

    location.href = url;//具体为啥改用这个,是个坑。。强烈建议这个

    }

    对应的后台:

    第一步:excel导出的主要工具类:

    public class ExcelExportUtil {

    public static HSSFWorkbook generateExcel(List> list, String title) {

    HSSFWorkbook book = new HSSFWorkbook();

    try{

    File desFile = new File("d:\\人员表.xls");

    FileOutputStream fos = new FileOutputStream(desFile);

    HSSFSheet sheet = book.createSheet("Sheet1");

    sheet.autoSizeColumn(1, true);//自适应列宽度

    //样式设置

    HSSFCellStyle style = book.createCellStyle();

    style.setFillForegroundColor(HSSFColor.SKY_BLUE.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 = book.createFont();

    font.setColor(HSSFColor.VIOLET.index);

    font.setFontHeightInPoints((short) 12);

    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

    // 把字体应用到当前的样式

    style.setFont(font);

    HSSFCellStyle style2 = book.createCellStyle();

    style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

    //设置上下左右边框

    style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);

    style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);

    style2.setBorderRight(HSSFCellStyle.BORDER_THIN);

    style2.setBorderTop(HSSFCellStyle.BORDER_THIN);

    style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);

    //填充表头标题

    int colSize = list.get(0).entrySet().size();

    System.out.println("size:" + colSize);

    //合并单元格供标题使用(表名)

    sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, colSize-1));

    HSSFRow firstRow = sheet.createRow(0);//第几行(从0开始)

    HSSFCell firstCell = firstRow.createCell(0);

    firstCell.setCellValue(title);

    firstCell.setCellStyle(style);

    //填充表头header

    HSSFRow row = sheet.createRow(1);

    Set> set = list.get(0).entrySet();

    List> l = new ArrayList>(set);

    System.out.println("l:" + l.size());

    for(int i=0; i< l.size(); i++) {

    String key = l.get(i).getKey();

    System.out.println(key);

    HSSFCell cell = row.createCell(i);

    cell.setCellValue(key);

    cell.setCellStyle(style2);

    }

    //填充表格内容

    System.out.println("list:" + list.size());

    for(int i=0; i

    HSSFRow row2 = sheet.createRow(i+2);//index:第几行

    Map map = list.get(i);

    Set> set2 = map.entrySet();

    List> ll = new ArrayList(set2);

    for(int j=0; j

    String val = ll.get(j).getValue();

    HSSFCell cell = row2.createCell(j);//第几列:从0开始

    cell.setCellValue(val);

    cell.setCellStyle(style2);

    }

    }

    // book.write(fos);

    // fos.close();

    } catch(Exception ex) {

    ex.printStackTrace();

    }

    return book;

    }

    }

    注意:

    1)合并单元格的语法,这里new CellRangeAddress(0, 0, 0, colSize-1)底层为:

    public CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)

    {

    super(firstRow, lastRow, firstCol, lastCol);

    }

    因此表示合并第一行第0-colSize-1列,这常常用于放置表的标题。

    2)createRow(int rownum)和createCell(int cellnum)表示创建第几行或第几列,都是从0开始。

    第二步,在第一步得到HSSFWorkbook的基础上,得到excel文件:涉及的jar包:spring-webmvc-4.x.jar

    public class ViewExcel extends AbstractExcelView {

    @Override

    protected void buildExcelDocument(Map map,

    HSSFWorkbook book, HttpServletRequest request, HttpServletResponse response)

    throws Exception {

    // String filename = "人员信息.xls";//设置下载时客户端Excel的名称

    // filename = encodeFilename(filename, request);//处理中文文件名

    response.setContentType("application/vnd.ms-excel");

    response.setHeader("Content-disposition", "attachment;filename=" + filename);

    OutputStream ouputStream = response.getOutputStream();

    book.write(ouputStream);

    ouputStream.flush();

    ouputStream.close();

    }

    }

    第三步,控制层:

    @RequestMapping(value = "/demo/demo-exportExcel.json")

    @ResponseBody

    public ModelAndView report(ModelMap model, HttpServletRequest request, HttpServletResponse response) {

    ViewExcel viewExcel = new ViewExcel();

    Map obj = null;

    System.out.println("response:" + response);

    //获取数据库表生成的workbook

    Map condition = new HashMap();

    //这里是从数据库里查数据并组装成我们想要的数据结构的过程,略。。

    List> data = dao.xxxx;

    HSSFWorkbook workbook = ExcelExportUtil.generateExcel(data, "人员信息表");

    try {

    viewExcel.buildExcelDocument(obj, workbook, request, response);

    } catch (Exception e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return new ModelAndView(viewExcel, model);

    }

    需注意:下载时是否弹出下载选择框是由浏览器的下载选项设置决定的,并不是代码决定的——特没有节操,害我折腾了N久!!

    成果:

    顺便提一下,做的过程遇到的一些j2se的语法问题:

    List转换为String[]的方法:

    String[] strs =list.toArray(new String[list.size()])即需指定String[]类型的参数,如果直接这样:String[] strs = (String[]) list.toArray();会出现类型转换的异常:

    [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

    展开全文
  • 1 概述在web项目常见一种场景就是将文件导出Excel,但是当需要导出多个Excel时,使用者将频繁操作,这样就严重降低了项目友好交互性以及易用性,那么怎么才能优雅解决这个问题呢?笔者今天分享将Excel导出...

    1 概述

    在web项目中常见的一种场景就是将文件导出为Excel,但是当需要导出多个Excel时,使用者将频繁操作,这样就严重降低了项目的友好交互性以及易用性,那么怎么才能优雅的解决这个问题呢?笔者今天分享将Excel导出后并压缩成zip包响应到浏览器端,希望对大家有所帮助。

    2 实现思路

    使用AEAI DP创建样例工程export_demo,创建测试数据表employee,使用DP预置的样例功能快速创建单表操作模型,扩展添加导出按钮

    cd1402cc0e9cf6e9a6140e2714db9842.png,扩展创建导出替换的模板EmployeeInfos.ftl,实现导出Excel的FileExportHelper-exportFile以及压缩的ZipHelper-doZip,dowmZip,deleteZip。

    3 实现步骤

    3.1 基础准备

    1.创建样例工程export_demo,并初始化数据库(具体可参见AEAI DP开发平台技术手册,下载链接http://www.agileai.com/portal/website/01/res-share.ptml);

    2.创建业务数据表,初始化sql;

    296af9f50e8165146c93a5d26604937f.png

    3.创建单表操作模型快速生成代码,(参见 AEAIDP开发平台技术手册),在此不做过多赘述;

    3.2 功能扩展

    1.扩展“导出Excel”按钮;

    在EmployeeManageList.jsp中添加按钮,并扩展js方法指向Handler

    54fce6373f864c6722ea3753d41a3c60.png

    2.创建导出替换数据模板(模板是基于Freemaker语法进行变量替换);

    5ca796398376af9df0e6406b3f48d844.png

    3.3 数据拼接

    1.构造导出数据拼接,调用FileExportHelper-exportFile实现导出Excel

    1)在EmployeeManageListHandler中扩展方法exportExcelFile拼接导出Excle用到的数据

    02fb49a0f018012af68418651ee6305a.png

    2)调用FileExportHelper-exportFile实现利用IO流将Excel导出至固定目录

    a42e555c7ec5c914af51b020b8ea6d0c.png

    2.调用ZipHelper-doZip将文件压缩为zip包,dowmZip将zip包响应到浏览器端,deleteZip将已生成的zip包删除节约服务器空间。

    1)doZip将文件压缩为zip包

    e099ee101acfa26487cd328f6233840e.png

    2)dowmZip将zip包响应到浏览器端

    596fe594643d65314927c341273cbaf1.png

    3)deleteZip将已生成的zip包删除节约服务器空间

    ce6cf2c7f469f27379c877de0bb4c28f.png

    3.4 演示效果

    浏览器输入http://localhost:6060/export_demo/index?Homepage

    0f9df169903f9942b9a064e23a937492.png

    输入用户名密码登录(账号admin,密码admin)

    fb1037bfc7abfc12ee995823e3ea954b.png

    访问职工管理点击“导出Excel”

    9f886ccbcd5b14788773092c4a07a174.png

    点击导出Excel将职工信息导出Zip包效果如下

    c5a606fa295efcefdfe667c1ce9710a0.png

    ecb042ea34486739880c0b7f17fd2d58.png

    打开压缩包可以查看导出的Excel

    57a86938f3f019bdee3d7f1bccec36f9.png

    点击查看Excel

    569548632696cf81a66556d119e04ded.png

    4 环境搭建

    1.到数通畅联官网(http://www.agileai.com)资源分享中下载AEAI DP以及HotServer 下载对应的介质

    2.使用Navicat创建数据库export,执行sql脚本export_mysql.sql

    3.启动HotServer,将工程导入AEAI DP并部署于HotServer

    ff18f5c08f04ad31be4af755e7584bb8.png

    4.浏览器访问http://localhost:6060/export_demo/index?Homepage登录后即可查看效果

    f525496789d15380573f8cf04ffd321c.png

    5 附件及说明

    附件为样例export_demo的源码,其中数据库脚本位于项目中sql文件夹下export_mysql.sql

    e61533877ed40d800b78977758cc9184.png

    文档及附件 下载

    展开全文
  • web项目数据导入导出是非常实用和常见,而excel文件则是十分常见格式。 Excel导入——解析已存在的excel文件,并把里面数据一一对应,插入到数据库表中,同时在页面上显示出来。(通常数据库里面
    
    

    在web项目中,对数据的导入导出是非常实用和常见的,而excel文件则是十分常见的格式。

    Excel导入——解析已存在的excel文件,并把里面的数据一一对应,插入到数据库表中,同时在页面上显示出来。(通常数据库里面会有一张字段与该excel表头一一对应的表);

    Excel导出——把数据库中的表的数据导出,保存在excel文件中。

     

    poi相对于jxl,是更为成熟的excel解析技术。这段时间折腾了几天,终于弄清楚了过程,特此记录。

    一些主要的基本概念:poi-3.8-x.jar

    HSSFWokbook——对应excel文件的工作薄

    HSSFSheet——对应excel文件的表空间

    HSSFRow——对应excel文件的表的行

    HSSFCell——对应excel文件的表单元格

    HSSFCellStyle——对应excel文件的表单元格样式

     

    一、Excel导入(需上传已存在的excel文件)

    已经存在的excel文件:

     

    jsp页面:

    Html代码  收藏代码
    1. <form name="" class="k-form col3" id="M2100F004">  
    2.     <label class="k-field-label">文件导入:</label>  
    3.         <input class="form-control k-field-file" data-allowblank="false" type="file" id="file" name="excelFile" />  
    4.     <button type="button" class="xxx" type="SUBMIT" onclick="importExcel">导入</button>  
    5. </form>  

     

    上传的js:

    Js代码  收藏代码
    1. $.ajaxFileUpload({  
    2.     url : "demo/demo-importExcel.json",  
    3.     //dataType : 'json',  
    4.     secureuri : false,  
    5.     fileElementId : 'file',  
    6.     success : function(res, status) { //服务器成功响应处理函数  
    7.         if (status) {  
    8.             //some code  
    9.         },  
    10.         error : function(res, status, e) {//服务器响应失败处理函数  
    11.             alert("导入数据异常:文件导入过程异常。");  
    12.         }  
    13.     });  
    14. }else{  
    15.     alert("导入数据异常:系统只支持Excel模板文件导入,请选择正确的模板文件.");  
    16.     return;  
    17.     }  
    18. }  

     

    对应的后台:

    Java代码  收藏代码
    1. @RequestMapping(value = "/demo/demo-importExcel.json")  
    2.     @ResponseBody  
    3.     public String importExcel( @RequestParam(value = "excelFile") MultipartFile excelFile,HttpServletRequest request) throws BiffException, IOException, KPromptException{  
    4.         if (null == excelFile) {  
    5.             result = "模板文件为空,请选择文件";  
    6.             return result;  
    7.         }  
    8.                   
    9. //      String path = request.getSession().getServletContext().getRealPath("demo2");  
    10.           
    11.         String path = "E:\\demo";  
    12.         //容错处理  
    13.         File dir = new File(path);  
    14.         if(!dir.exists()) {  
    15.             dir.mkdirs();  
    16.         }  
    17.         String fileName = excelFile.getOriginalFilename();//report.xls  
    18.         String fileName2 = excelFile.getName();//excelFile  
    19.           
    20.         InputStream fis = excelFile.getInputStream();  
    21.          
    22.        List<Map<String, Stirng>>  data = ExcelImportUtil..parseExcel(fis);  
    23.            //解析到的数据就可以做一些数据库的插入操作了……  
    24.        return "success";  
    25.     }  

     

    重点来了,excel导入我把它封装成了一个工具方法:

    Java代码  收藏代码
    1. public class ExcelImportUtil {  
    2.     public static List<Map<String, String>> parseExcel(InputStream fis) {  
    3.         List<Map<String, String>> data = new ArrayList<Map<String, String>>();;  
    4.         try {  
    5.             HSSFWorkbook book = new HSSFWorkbook(fis);  
    6.             HSSFSheet sheet = book.getSheetAt(0);  
    7.             int firstRow = sheet.getFirstRowNum();  
    8.             int lastRow = sheet.getLastRowNum();  
    9.             //除去表头和第一行  
    10. //          ComnDao dao = SysBeans.getComnDao();  
    11.             for(int i = firstRow + 1; i<lastRow+1; i++) {  
    12.                 Map map = new HashMap();  
    13.                   
    14.                 HSSFRow row = sheet.getRow(i);  
    15.                 int firstCell = row.getFirstCellNum();  
    16.                 int lastCell = row.getLastCellNum();  
    17.                   
    18.                   
    19.                 for(int j=firstCell; j<lastCell; j++) {  
    20.                       
    21.                     HSSFCell cell2 = sheet.getRow(firstRow + 1).getCell(j);  
    22.                     String key = cell2.getStringCellValue();  
    23.                       
    24.                     HSSFCell cell = row.getCell(j);  
    25.                       
    26.                     if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {  
    27.                         cell.setCellType(HSSFCell.CELL_TYPE_STRING);  
    28.                     }  
    29.                     String val = cell.getStringCellValue();  
    30.                       
    31. //              System.out.println(val);  
    32.                       
    33.                     if(i == firstRow + 1) {  
    34.                         break;  
    35.                     }else{  
    36.                         map.put(key, val);  
    37.                           
    38.                     }  
    39. //              System.out.println(map);  
    40.                 }  
    41.                 if(i != firstRow + 1) {  
    42.                     data.add(map);  
    43.                     System.out.println(map);  
    44.                 }  
    45.             }  
    46.             System.out.println(data);  
    47.         } catch (IOException e) {  
    48.             e.printStackTrace();  
    49.         }  
    50.         return data;  
    51.     }  
    52. }  

     

    可看到数据库中的结果:



     

    注意:

    1)poi的api读取excel文件时,最常见的两种cell的数据格式是Numeric和String,所以当是数字格式的时候,需要把它的cell type转成String,否则会出现Cannot get a numeric value from a text cell的错误。对应的,设计相应数据库表最好都是Varchar2格式的。

     

    2)需注意需要解析的只是表的数据,所以表的标题应该不在解析范围内;但表头需要解析,他们对应数据库表里的字段;row和cell的位置都是从0开始,

     

    二、Excel导出(这里用到了spring的AbstractExcelView)

    首先页面:

    Html代码  收藏代码
    1. <a    href="demo/demo-exportExcel.json" data-descript="导出测试">导出</a>  
    2.   
    3. <!-- 或者抽离出一个js-->  
    4. var exportExcel = function(){  
    5.         var url = "demo/demo-exportExcel.json";  
    6.         //window.open(url);  
    7.                 location.href = url;//具体为啥改用这个,是个坑。。强烈建议这个  
    8.             }  

     对应的后台:

    第一步:excel导出的主要工具类:

    Java代码  收藏代码
    1. public class ExcelExportUtil {  
    2.       
    3.     public static HSSFWorkbook generateExcel(List<Map<String, String>> list, String title) {  
    4.         HSSFWorkbook book = new HSSFWorkbook();  
    5.         try{  
    6.             File desFile = new File("d:\\人员表.xls");  
    7.             FileOutputStream fos = new FileOutputStream(desFile);  
    8.                         HSSFSheet sheet = book.createSheet("Sheet1");  
    9.             sheet.autoSizeColumn(1true);//自适应列宽度  
    10.             //样式设置  
    11.             HSSFCellStyle style = book.createCellStyle();  
    12.             style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);  
    13.               style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
    14.               style.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
    15.               style.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
    16.               style.setBorderRight(HSSFCellStyle.BORDER_THIN);  
    17.               style.setBorderTop(HSSFCellStyle.BORDER_THIN);  
    18.               style.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
    19.               // 生成一个字体  
    20.               HSSFFont font = book.createFont();  
    21.               font.setColor(HSSFColor.VIOLET.index);  
    22.               font.setFontHeightInPoints((short12);  
    23.               font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
    24.               // 把字体应用到当前的样式  
    25.               style.setFont(font);  
    26.               
    27.                 
    28.               HSSFCellStyle style2 = book.createCellStyle();  
    29.                   style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
    30.                   //设置上下左右边框  
    31.                   style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
    32.                   style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
    33.                   style2.setBorderRight(HSSFCellStyle.BORDER_THIN);  
    34.                   style2.setBorderTop(HSSFCellStyle.BORDER_THIN);  
    35.                   style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
    36.                     
    37.               //填充表头标题  
    38.               int colSize = list.get(0).entrySet().size();  
    39.               System.out.println("size:" + colSize);  
    40.               //合并单元格供标题使用(表名)  
    41.               sheet.addMergedRegion(new CellRangeAddress(000, colSize-1));  
    42.               HSSFRow firstRow = sheet.createRow(0);//第几行(从0开始)  
    43.               HSSFCell firstCell = firstRow.createCell(0);  
    44.               firstCell.setCellValue(title);  
    45.               firstCell.setCellStyle(style);  
    46.                 
    47.               //填充表头header  
    48.               HSSFRow row = sheet.createRow(1);  
    49.               Set<Entry<String, String>> set = list.get(0).entrySet();  
    50.               List<Entry<String, String>> l = new ArrayList<Map.Entry<String,String>>(set);  
    51.               System.out.println("l:" + l.size());  
    52.               for(int i=0; i< l.size(); i++) {  
    53.                   String key = l.get(i).getKey();  
    54.                   System.out.println(key);  
    55.                   HSSFCell cell = row.createCell(i);  
    56.                   cell.setCellValue(key);  
    57.                   cell.setCellStyle(style2);  
    58.               }  
    59.                 
    60.               //填充表格内容  
    61.               System.out.println("list:" + list.size());  
    62.               for(int i=0; i<list.size(); i++) {  
    63.                   HSSFRow row2 = sheet.createRow(i+2);//index:第几行  
    64.                   Map<String, String> map = list.get(i);  
    65.                   Set<Entry<String, String>> set2 = map.entrySet();  
    66.                   List<Entry<String, String>> ll = new ArrayList(set2);  
    67.                   for(int j=0; j<ll.size(); j++) {  
    68.                       String val = ll.get(j).getValue();  
    69.                       HSSFCell cell = row2.createCell(j);//第几列:从0开始  
    70.                       cell.setCellValue(val);  
    71.                       cell.setCellStyle(style2);  
    72.                   }  
    73.               }  
    74.                 
    75. //           book.write(fos);   
    76. //           fos.close();  
    77.         } catch(Exception ex) {  
    78.             ex.printStackTrace();  
    79.         }  
    80.         return book;  
    81.     }  
    82.       
    83. }  

     注意:

    1)合并单元格的语法,这里new CellRangeAddress(0, 0, 0, colSize-1)底层为:

    Java代码  收藏代码
    1. public CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)  
    2.  {  
    3.    super(firstRow, lastRow, firstCol, lastCol);  
    4.  }  

     因此表示合并第一行第0-colSize-1列,这常常用于放置表的标题。

    2)createRow(int rownum)和createCell(int cellnum)表示创建第几行或第几列,都是从0开始。

     

    第二步,在第一步得到HSSFWorkbook的基础上,得到excel文件:涉及的jar包:spring-webmvc-4.x.jar

     

    Java代码  收藏代码
    1. public class ViewExcel extends AbstractExcelView {  
    2.   
    3.     @Override  
    4.     protected void buildExcelDocument(Map<String, Object> map,  
    5.             HSSFWorkbook book, HttpServletRequest request, HttpServletResponse response)  
    6.             throws Exception {  
    7. //        String filename = "人员信息.xls";//设置下载时客户端Excel的名称         
    8. //          filename = encodeFilename(filename, request);//处理中文文件名      
    9.             response.setContentType("application/vnd.ms-excel");         
    10.             response.setHeader("Content-disposition""attachment;filename=" + filename);         
    11.             OutputStream ouputStream = response.getOutputStream();         
    12.             book.write(ouputStream);         
    13.             ouputStream.flush();         
    14.             ouputStream.close();     
    15.   
    16.     }  
    17. }  

     

    第三步,控制层:

     

    Java代码  收藏代码
    1. @RequestMapping(value = "/demo/demo-exportExcel.json")  
    2.     @ResponseBody  
    3.     public ModelAndView report(ModelMap model, HttpServletRequest request, HttpServletResponse response) {  
    4.          ViewExcel viewExcel = new ViewExcel();        
    5.           Map obj = null;    
    6.           System.out.println("response:" + response);  
    7.           //获取数据库表生成的workbook    
    8.           Map condition = new HashMap();    
    9.               //这里是从数据库里查数据并组装成我们想要的数据结构的过程,略。。  
    10.               List<Map<String, String>>  data = dao.xxxx;  
    11.           HSSFWorkbook workbook = ExcelExportUtil.generateExcel(data, "人员信息表");    
    12.           try {    
    13.            viewExcel.buildExcelDocument(obj, workbook, request, response);    
    14.           } catch (Exception e) {    
    15.         // TODO Auto-generated catch block    
    16.               e.printStackTrace();    
    17.           }    
    18.           return new ModelAndView(viewExcel, model);       
    19.     }  

     

    需注意:下载时是否弹出下载选择框是由浏览器的下载选项设置决定的,并不是代码决定的——特没有节操,害我折腾了N久!!

    成果:



     

    顺便提一下,做的过程遇到的一些j2se的语法问题:

    List<String>转换为String[]的方法:

    String[] strs = list.toArray(new String[list.size()])即需指定String[]类型的参数,如果直接这样:String[] strs = (String[]) list.toArray();会出现类型转换的异常:

    [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

    展开全文
  • java实现Excel压缩成Zip导出

    千次阅读 2017-01-08 14:22:43
    web项目常见一种场景就是将文件导出Excel,但是当需要导出多个Excel时,使用者将频繁操作,这样就严重降低了项目友好交互性以及易用性,那么怎么才能优雅解决这个问题呢?笔者今天分享将Excel导出后并...

    1 概述

    在web项目中常见的一种场景就是将文件导出为Excel,但是当需要导出多个Excel时,使用者将频繁操作,这样就严重降低了项目的友好交互性以及易用性,那么怎么才能优雅的解决这个问题呢?笔者今天分享将Excel导出后并压缩成zip包响应到浏览器端,希望对大家有所帮助。

    2 实现思路

    使用AEAI DP创建样例工程export_demo,创建测试数据表employee,使用DP预置的样例功能快速创建单表操作模型,扩展添加导出按钮,扩展创建导出替换的模板EmployeeInfos.ftl,实现导出Excel的FileExportHelper-exportFile以及压缩的ZipHelper-doZip,dowmZip,deleteZip。

    3 实现步骤

    3.1 基础准备

    1.创建样例工程export_demo,并初始化数据库(具体可参见AEAI DP开发平台技术手册,下载链接http://www.agileai.com/portal/website/01/res-share.ptml);

    2.创建业务数据表,初始化sql;


    3.创建单表操作模型快速生成代码,(参见 AEAIDP开发平台技术手册),在此不做过多赘述;

    3.2 功能扩展

    1.扩展“导出Excel”按钮;

    在EmployeeManageList.jsp中添加按钮,并扩展js方法指向Handler


    2.创建导出替换数据模板(模板是基于Freemaker语法进行变量替换);


    3.3 数据拼接

    1.构造导出数据拼接,调用FileExportHelper-exportFile实现导出Excel
    1)在EmployeeManageListHandler中扩展方法exportExcelFile拼接导出Excle用到的数据

    2)调用FileExportHelper-exportFile实现利用IO流将Excel导出至固定目录

    2.调用ZipHelper-doZip将文件压缩为zip包,dowmZip将zip包响应到浏览器端,deleteZip将已生成的zip包删除节约服务器空间。
    1)doZip将文件压缩为zip包

    2)dowmZip将zip包响应到浏览器端

    3)deleteZip将已生成的zip包删除节约服务器空间

    3.4 演示效果

    浏览器输入http://localhost:6060/export_demo/index?Homepage


    输入用户名密码登录(账号admin,密码admin)


    访问职工管理点击“导出Excel”


    点击导出Excel将职工信息导出Zip包效果如下



    打开压缩包可以查看导出的Excel


    点击查看Excel


    4 环境搭建

    1.到数通畅联官网(http://www.agileai.com)资源分享中下载AEAI DP以及HotServer 下载对应的介质


    2.使用Navicat创建数据库export,执行sql脚本export_mysql.sql

    3.启动HotServer,将工程导入AEAI DP并部署于HotServer


    4.浏览器访问http://localhost:6060/export_demo/index?Homepage登录后即可查看效果


    5 附件及说明

    附件为样例export_demo的源码,其中数据库脚本位于项目中sql文件夹下export_mysql.sql


    文档及附件 下载

    展开全文
  • web项目常见一种场景就是将文件导出Excel,但是当需要导出多个Excel时,使用者将频繁操作,这样就严重降低了项目友好交互性以及易用性,那么怎么才能优雅解决这个问题呢?笔者今天分享将Excel导出后并...
  • Excel jxl导入导出

    2014-07-19 23:20:00
    JAVA EXCEL API简介 Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建...因为是使用Java编写的,所以我们在Web应用可以通过JSP、Servlet来调用API实现对Excel数据表的访问。 ...
  • 那么今天就向大家介绍在MVC如何导出word模板,顺便附加如何将数据表导出Excel中导出word实现步骤 实现大致思路 1:新建一个Word文档合同模板,其次这个模板进行添加书签名称。 2:将Word文档合同模板更改...
  • JAVA EXCEL API简介 Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的...因为是使用Java编写的,所以我们在Web应用可以通过JSP、 Servlet来调用API实现对Excel数据表的访问。 现在发布的稳...
  • java导出excel jxl用法

    2014-11-16 16:11:36
    Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel...因为是使用Java编写的,所以我们在Web应用可以通过JSP、Servlet来调用API实现对Excel数据表的访问。  搭建环境 : 将下载后的文件解包,得到jx
  • JAVA EXCEL API简介 Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建...因为是使用Java编写的,所以我们在Web应用可以通过JSP、 Servlet来调用API实现对Excel数据表的访问。 ...
  • [code="java"] JAVA EXCEL API简介 Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件内容、...因为是使用Java编写,所以我们在Web应用可以通过JSP、 Servlet来调用API实现对E...
  • 1 概述在web项目常见一种场景就是将文件导出Excel,但是当需要导出多个Excel时,使用者将频繁操作,这样就严重降低了项目友好交互性以及易用性,那么怎么才能优雅解决这个问题呢?笔者今天分享将Excel导出...
  • Excel通用导入实现

    2014-03-07 17:02:10
    web开发过程,经常会有对Excel操作功能,导入/导出都是家常便饭。本文主要记录一下自己平时在工作总结一些方法。希望大家多多指点交流。 通用导入功能设计 有导入功能业务场景一般都是需要把业务方提供...
  • 在写完了 工具类PoiUtils 后 需要编写业务层 和 控制层来实现后端整个场景 目前涉及到东西有 1、数据库及其连接工具(myssql + mybatis), ...在创建的webproject 数据库新建了两张 project(计划..
  • Web开发,如果需要将Excel文档的信息导入到数据库或者将数据库的信息导出Excel文档中,这就需要应用程序访问Excel...(3)最后由Sheet对象获取工作表的行、列,并基于行、列值工作表的单元格实现读操作 Work
  • JAVA与EXCEL

    2011-02-28 11:28:00
    JAVA实现EXCEL的导入和导出(四) JAVA EXCEL API简介   ...因为是使用Java编写的,所以我们在Web应用可以通过JSP、 Servlet来调用API实现对Excel数据表的访问。   现在发布的稳
  • Excel VBA实用技巧大全 附书源码

    热门讨论 2010-10-08 18:59:24
    01062获取Excel的Web工具栏信息 01063获取Excel审阅工具栏信息 01064获取Excel窗体工具栏信息 01065获取Excel外部数据工具栏信息 01066获取Excel公式审核工具栏信息 01067获取Excel控件工具箱工具栏信息 01068获取...
  • EXCEL集成工具箱V6.0

    2010-09-11 01:44:37
    【批量导出图片】 将EXCEL中指定某列中的图片按显示图片大小导出到指定文件夹。 批 注 工 具 【插入样式批注】 提供50种花样批注供选择,可随时更换,且美观大方。 【插入图片批注】 不仅提供多样批注供选择...
  • GTimeSheet Web

    2012-10-08 10:42:52
    容易与其它系统无缝集成,提供基于excel基础数据导入导出功能; 提供weservice支持,达到数据同步;可与用户现有财务系统、CRM系统、OA、ERP做相关接口,实现信息同步,数据相互引用、交换; 主要模块包括:...
  • 【批量导出图片】 将EXCEL中指定某列中的图片按显示图片大小导出到指定文件夹。 批 注 工 具 【插入样式批注】 提供50种花样批注供选择,可随时更换,且美观大方。 【插入图片批注】 不仅提供多样批注供...
  • 介绍了应用Java Web进行程序开发各个方面知识和技巧,主要包括Java Web编程基础、文件操作管理、图形图像与多媒体技术、窗体应用技术、JSP操作Word与Excel等。全书分6篇23章,共计600个实例和600个经验技巧。每...
  • 【批量导出图片】 将EXCEL中指定某列中的图片按显示图片大小导出到指定文件夹。 批 注 工 具 【插入样式批注】 提供50种花样批注供选择,可随时更换,且美观大方。 【插入图片批注】 不仅提供多样批注供选择,...
  • 【批量导出图片】 将EXCEL中指定某列中的图片按显示图片大小导出到指定文件夹。 批 注 工 具 【插入样式批注】 提供50种花样批注供选择,可随时更换,且美观大方。 【插入图片批注】 不仅提供多样批注供选择...
  • 【批量导出图片】 将EXCEL中指定某列中的图片按显示图片大小导出到指定文件夹。 批 注 工 具 【插入样式批注】 提供50种花样批注供选择,可随时更换,且美观大方。 【插入图片批注】 不仅提供多样批注供...
  • 查询时可以根据多种条件组合查询货品记录,可通过EXCEL表导出数据,并可以打印出历史数据列表。 入库管理:(包括新增、入库单查询、 入库货品查询)入库货品进行审批,也可以建立直接入库单,入库货品进行查询...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 122
精华内容 48
关键字:

web中实现对excel表的导出