最新消息:

Java导出Excel的另一种思路

Java 观测者 1741浏览

在实际项目中往往有这种需求,把JSP页面上展示的报表导出成Excel,本站曾展示过程序实例。但这种方法过于繁琐,程序冗长,缺乏通用性。其实我们完全可以用另一种思路来实现Excel的导出。

我们发现,在Java导出Excel的函数中花了很大篇幅绘制Excel表头,例如背景色、合并单元格、字体等等。为了减少这部分的代码量,我们可以直接把表头在Excel中绘制好,然后存在服务器的某个路径中,这个绘制好表头的Excel称作一个模板。在下载函数中,我们首先读取这个模板,然后另存一份到下载路径中,再往这个另存的Excel文件中写数据。如果这个Excel模板表头占了1行,我们就从第2行开始写数据,如果表头占了2行,就从第3行开始写数据,依此类推。

表头的设计方法如下:

其中第3行的英文字段与Map中的key相对应,一般用户不需要看到这一行,我们可以将之隐藏:

我们可以从程序中获取到,该表头实际占了3行,那么我们就从第4行开始写数据。

完整代码如下:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.io.File;
import jxl.Cell;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class ExportExcel {

   /**
    * 测试函数
    * @param args
    */
   public static void main(String[] args) {
       Map map1 = new HashMap();
       map1.put("name", "张三");
       map1.put("age", "20");
       
       Map map2 = new HashMap();
       map2.put("name", "李四");
       map2.put("age", "21");
       
       List<Map> list = new ArrayList(5);
       list.add(map1);
       list.add(map2);
       
       ExportExcel export= new ExportExcel();
       export.exportExcel("E:\\test.xls","D:\\test.xls",list);
   }
   
   /**
    * Excel文件下载
    * @param templetPath 模板路径(只包含表头)
    * @param targetPath 文件生成路径
    * @param valueList  数据列表
    */
   public void exportExcel(String templetPath,String targetPath,List<Map> valueList){
       try {
           Workbook wb=Workbook.getWorkbook(new File(templetPath));
           WritableWorkbook book= Workbook.createWorkbook(new File(targetPath),wb);
           WritableSheet sheet = book.getSheet(0);              //获取Excel文件的第一个工作表
           
           WritableFont wf = new WritableFont(WritableFont.ARIAL,12,WritableFont.NO_BOLD,false,
                   UnderlineStyle.NO_UNDERLINE,Colour.BLACK);   //定义格式 字体 下划线 斜体 粗体 颜色
           WritableCellFormat wcf = new WritableCellFormat(wf); //单元格定义
           wcf.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN,jxl.format.Colour.BLACK); //设置边框
           wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
           wcf.setAlignment(Alignment.RIGHT);
           
           int columnum = sheet.getColumns();
           int rownum = sheet.getRows();
           System.out.println("表头列数:"+columnum+" 表头行数:"+rownum);
           
           for (int i=0;i<valueList.size();i++){           //按行循环
               Map item = valueList.get(i);
               for(int j=0;j<columnum;j++){                //按列循环
                   Cell cell = sheet.getCell(j,rownum-1);  //获取Excel模板中的隐藏列
                   String result = cell.getContents();
                   sheet.addCell(new Label(j, i+rownum, item.get(result)==null?"":item.get(result).toString(), wcf));
               }
           }
           book.write();
           book.close();
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
   
}

该代码中的exportExcel方法为通用方法。实际调用这个方法的代码只有一句:

export.exportExcel("E:\\test.xls","D:\\test.xls",list);

这个List我这里是手动生成的,也可以是从数据库里直接查出来,然后将之作为参数去调用exportExcel方法。通过这种方式,已经大大地减少了我们的工作量。

转载请注明:观测者 » Java导出Excel的另一种思路