JAVA实现导出Excel表POI

一、说明

Java导出Excel我们需要在项目中导入apache的poi.jar。

下载地址:http://poi.apache.org/download.html。

下载后将根目录下的poi-3.6-20091214.jar和Lib目录下三个通用包 commons-logging-1.1.jar junit-3.8.1.jar log4j-1.2.13.jar拷贝到项目的Lib下。

二、HSSF介绍

HSSF(用于操作Excel的组件)提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,还有辅助操作。有以下几种对象:

常用组件:

HSSFWorkbook                      excel的文档对象

HSSFSheet                         excel的表单

HSSFRow                           excel的行

HSSFCell                          excel的格子单元

HSSFFont                          excel字体

HSSFDataFormat                    日期格式

HSSFHeader                        sheet头

HSSFFooter                        sheet尾(只有打印的时候才能看到效果)

样式:

HSSFCellStyle                       cell样式

辅助操作包括:

HSSFDateUtil                        日期

HSSFPrintSetup                      打印

HSSFErrorConstants                  错误信息表

首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。

基本操作步骤:

1、用HSSFWorkbook打开或者创建“Excel文件对象”

2、用HSSFWorkbook对象返回或者创建Sheet对象

3、用Sheet对象返回行对象,用行对象得到Cell对象

4、对Cell对象读写。

如何使用Excel在这里就不说了,在POI中Excel的行和单元格都对应POI中的一个类。

下面就直接贴代码了,代码上大部分有注释,如果不懂请在下面留言。

  1. //生成excel文件
  2. @RequestMapping(value = "/exportexcel",method = RequestMethod.GET)
  3. @ResponseBody
  4. public void exportexcel(HttpServletRequest request, HttpServletResponse response){
  5.         try {
  6.             String secrecystr = null;
  7.             //设置excel工作表的标题,大家根据自己的情况自行修改
  8.             String[] title = {"编号","提交人","反馈内容","所属子公司","是否保密","发布时间","反馈类型"};
  9.             //获取开始时间,用于计算导出时间
  10.             long start = System.currentTimeMillis();
  11. //获取本地路径
  12. String path = request.getSession().getServletContext().getRealPath(File.separator) + "upload" + File.separator + "excel" + File.separator;
  13.             File file = new File(path);
  14.             //判断文件夹是否存在
  15.             if (!file.exists() && !file.isDirectory()) {
  16.                 //不存在文件夹则创建
  17.                 file.mkdirs();
  18.             }
  19.             //输出的excel的路径及文件名 
  20.             String filePath = path + "opinion.xls";
  21.             //新建立一个jxl文件,即在文件路径下生成了opinion.xls
  22.             OutputStream os = new FileOutputStream(filePath);
  23.             //创建excel工作薄
  24.             WritableWorkbook wwb = Workbook.createWorkbook(os);
  25.            //添加第一个工作表并设置第一个Sheet的名字(不知道Sheet是什么的童鞋请自行百度)   
  26.             WritableSheet sheet = wwb.createSheet("反馈"0);
  27.             for (int i = 0; i < title.length; i++) {
  28.                 //Label(x,y,z) 代表单元格的第x+1列,第y+1行, 内容z     
  29.                 //在Label对象的子对象中指明单元格的位置和内容     
  30.                 Label label = new Label(i,0,title[i],getHeaderCellStyle());
  31.                 //getHeaderCellStyle是excel的样式     
  32.                 //将定义好的单元格添加到工作表中     
  33.                 sheet.addCell(label);
  34.             }
  35.             //下面是填充数据     
  36.             /*    
  37.              * 保存数字到单元格,需要使用jxl.write.Number  
  38.              * 必须使用其完整路径,否则会出现错误  
  39.              * */
  40.             //这里是小C项目中使用的List,大家可以根据自己的情况自行修改
  41.             List<Opinion> opinionlist = staffService.opinionlist();
  42.             for (int i = 0; i < opinionlist.size(); i++) {
  43.                 //填充编号     
  44.                 jxl.write.Number number = new jxl.write.Number(0,i+1,opinionlist.get(i).getOid());
  45.                 sheet.addCell(number);
  46.                 //填充提交人     
  47.                 Label oname = new Label(1,i+1,opinionlist.get(i).getOname());
  48.                 sheet.addCell(oname);
  49.                 //反馈内容
  50.                 Label ocontent = new Label(2,i+1,opinionlist.get(i).getOcontent());
  51.                 sheet.addCell(ocontent);
  52.                 //设置第3列,列宽为50
  53.                 sheet.setColumnView(250);
  54.                 //填充所属子公司   
  55.                 Label subsidiary = new Label(3,i+1,opinionlist.get(i).getSubsidiary());
  56.                 sheet.addCell(subsidiary);
  57.                 sheet.setColumnView(320);
  58.                 if (opinionlist.get(i).getSecrecy() == 1) {
  59.                     secrecystr = "保密";
  60.                 } else {
  61.                     secrecystr = "未保密";
  62.                 }
  63.                 //是否保密
  64.                 Label secrecy = new Label(4, i+1, secrecystr);
  65.                 sheet.addCell(secrecy);
  66.                 //反馈时间
  67.                jxl.write.DateFormat df = new jxl.write.DateFormat("yyyy-MM-dd HH:mm:ss");
  68.                 jxl.write.WritableCellFormat wcf = new jxl.write.WritableCellFormat(df);
  69.                 jxl.write.DateTime odate = new jxl.write.DateTime(5, i+1, opinionlist.get(i).getOdate(), wcf);
  70.                 sheet.addCell(odate);
  71.                 //设置第5列,列宽为20
  72.                 sheet.setColumnView(520);
  73.                 //反馈类型
  74.                 Label otype = new Label(6, i+1, opinionlist.get(i).getOtype());
  75.                 sheet.addCell(otype);
  76.             }
  77.             //写入数据     
  78.             wwb.write();
  79.             //关闭文件
  80.             wwb.close();
  81.             os.close();
  82.             long end = System.currentTimeMillis();
  83.             System.out.println("用时:"+(end-start)/1000+"s。小子,你怎么跑这么快呢?");
  84.         } catch (IOException e) {
  85.             e.printStackTrace();
  86.             System.out.println("创建失败");
  87.         } catch (RowsExceededException e) {
  88.             e.printStackTrace();
  89.             System.out.println("excel单元设置创建失败");
  90.         } catch (WriteException e) {
  91.             e.printStackTrace();
  92.             System.out.println("excel写入失败");
  93.         } catch (Exception ex) {
  94.             ex.printStackTrace();
  95.             System.out.println("出错了");
  96.         }
  97.  }

下面是excel表样式

  1. /** 
  2.   * 表头单元格样式的设定 
  3.   */
  4. public WritableCellFormat getHeaderCellStyle(){
  5.         /* 
  6.          * WritableFont.createFont("宋体"):设置字体为宋体 
  7.          * 10:设置字体大小 
  8.          * WritableFont.BOLD:设置字体加粗(BOLD:加粗     NO_BOLD:不加粗) 
  9.          * false:设置非斜体 
  10.          * UnderlineStyle.NO_UNDERLINE:没有下划线 
  11.          */
  12.         WritableFont font = new WritableFont(WritableFont.createFont("宋体"),
  13.                                              10,
  14.                                              WritableFont.BOLD,
  15.                                              false,
  16.                                              UnderlineStyle.NO_UNDERLINE);
  17.         WritableCellFormat headerFormat = new WritableCellFormat(NumberFormats.TEXT);
  18.         try {
  19.             //添加字体设置  
  20.             headerFormat.setFont(font);
  21.             //设置单元格背景色:表头为黄色  
  22.             //headerFormat.setBackground(Colour.YELLOW);  
  23.             //设置表头表格边框样式  
  24.             //整个表格线为粗线、黑色  
  25.             //headerFormat.setBorder(Border.ALL, BorderLineStyle.THICK, Colour.BLACK);  
  26.             //表头内容水平居中显示  
  27.             headerFormat.setAlignment(Alignment.CENTRE);
  28.         } catch (WriteException e) {
  29.             e.printStackTrace();
  30.         }
  31.         return headerFormat;
  32. }

三、注意

特别注意!这个不能直接运行,主要是让大家知道每个方法的用处,请大家根据自己的实际情况自行修改代码,如果有不懂的地方请在下面留言,小C看到后会第一时间回复大家。

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

    A+
发布日期:2016年01月25日  所属分类:Java
标签:

发表评论

gravatar

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen: