JAVA中EXLS导出功能实现

、导出功能实现

  

(1)POI介绍

     Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 Microsoft Office文档的功能。

(2)POI结构说明

 

包名称说明

HSSF提供读写Microsoft Excel XLS格式档案的功能。

XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。

HWPF提供读写Microsoft Word DOC格式档案的功能。

HSLF提供读写Microsoft PowerPoint格式档案的功能。

HDGF提供读Microsoft Visio格式档案的功能。

HPBF提供读Microsoft Publisher格式档案的功能。

HSMF提供读Microsoft Outlook格式档案的功能。

(3)POI常用类说明

类名                     说明

HSSFWorkbook           Excel的文档对象

HSSFSheet                  Excel的表单

HSSFRow                    Excel的行

HSSFCell                     Excel的格子单元

HSSFFont                    Excel字体

 

HSSFDataFormat        格子单元的日期格式

HSSFHeader             Excel文档Sheet的页眉

HSSFFooter             Excel文档Sheet的页脚

HSSFCellStyle          格子单元样式

HSSFDateUtil           日期

HSSFPrintSetup        打印

 

HSSFErrorConstants   错误信息表

1、利用poi来进行解析数据并导出exls表格:

  

      
   //获取到导出查询结果
     ResultPage resulta=queryDataService.getexportkey(flowid, text); //获取主键属性 List<String> list=resulta.getExportlist(); //获取修改属性 List<String> reviselist=resulta.getExportreviselist(); //获取属性中文 List<String>cnlist=resulta.getExportkeycnlist(); //获取已选择数据 List datalist=resulta.getList(); //装载主键信息及数据 /** * 装载的数据类型为List<List<String>> * 里层List<String>为 一行数据的总和 * 外层List 为 所有列的总和 */ List<List<String>> data=new ArrayList(); for(int i=0;i<datalist.size();i++){ Map map=(Map)datalist.get(i); List<String> datas=new ArrayList(); for(int n=0;n<list.size();n++){ String key=list.get(n); String value=String.valueOf(map.get(key)); datas.add(value); } data.add(datas); } List<List<String>> revisedata=new ArrayList(); for(int i=0;i<datalist.size();i++){ Map map=(Map)datalist.get(i); List<String> revise=new ArrayList(); for(int n=0;n<reviselist.size();n++){ String key=reviselist.get(n); // System.out.println("key>>>>>>>>>"+key); String value=String.valueOf(map.get(key)); revise.add(value); } revisedata.add(revise); } HttpServletResponse response=super.getResponse(); ServletOutputStream out=null;

 

 

 

  1 HSSFWorkbook workbook = new HSSFWorkbook();//创建Excel文件(Workbook)
  2 //设置表名
  3          String classname="基础调整-"+text+"";
  4          //表名导出中文格式化
  5          String name=new String(classname.getBytes("gbk"),"iso-8859-1");
  6          
  7          response.setHeader("content-disposition", "attchment;filename="+name+".xls");
  8          HSSFSheet sheet = workbook.createSheet("基础调整");//创建工作表(Sheet)
  9 try {
 10                   //创建表头属性   第一行
 11                   sheet.setColumnWidth(0, 5120);//设置第i列的宽度是31个字符宽度
 12                   HSSFRow row = sheet.createRow(0);
 13                   for(int n=0;n<cnlist.size();n++){
 14                      String cnkeys=cnlist.get(n);
 15                      HSSFCellStyle style=workbook.createCellStyle();
 16                     
 17                      style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
 18                      style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
 19                       HSSFFont font = workbook.createFont();
 20                         font.setFontName("仿宋");//设置字体名称
 21                         
 22                         font.setFontHeightInPoints((short)12);//设置字号
 23                        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
 24                     
 25                     style.setFont(font);
 26                     //
 27                     HSSFCell cell = row.createCell(n);
 28                     
 29                     cell.setCellValue(cnkeys);
 30                     cell.setCellStyle(style);
 31                   }
 32                   //创建剩下行并添加值
 33                  for (int i=1;i<data.size()+1;i++){
 34                     List<String> strings = data.get(i-1);
 35                     //
 36                     row = sheet.createRow(i);
 37                     sheet.setColumnWidth(i, 5120);//设置第i列的宽度是31个字符宽度
 38                     //System.out.println("strings>>>>>>>>>"+data.size());
 39                     //添加主键列数据
 40                    for (int j=0;j<strings.size();j++){
 41                        
 42                        HSSFCellStyle style=workbook.createCellStyle();
 43                        
 44                        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
 45                        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
 46                          HSSFFont font = workbook.createFont();
 47                             font.setFontName("仿宋");//设置字体名称
 48                             
 49                             font.setFontHeightInPoints((short)12);//设置字号
 50                            font.setColor(HSSFColor.RED.index);//设置字体颜色
 51                         
 52                         style.setFont(font);
 53                         String str= strings.get(j);
 54                         //
 55                         HSSFCell cell = row.createCell(j);
 56                         
 57                         cell.setCellValue(str);
 58                         cell.setCellStyle(style);
 59                     }
 60                    //添加可修改属性数据
 61                    int k=list.size();
 62                        //System.out.println("revisedata>>>>>>>>>"+revisedata.size());
 63                        Object obj=JSONArray.fromObject(revisedata);
 64                        System.out.println("revisedata>>>>>>>>>"+obj.toString());
 65                      
 66                          List<String> str= revisedata.get(i-1);
 67                                 for(int w=0;w<str.size();w++){
 68                                             HSSFCellStyle style=workbook.createCellStyle();
 69                                                style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
 70                                                style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
 71                                             HSSFFont font = workbook.createFont();
 72                                             font.setFontName("仿宋");//设置字体名称
 73                                             font.setFontHeightInPoints((short)12);//设置字号
 74                                             style.setFont(font);
 75                                         HSSFCell cell = row.createCell(k++);
 76                                         String value=str.get(w);
 77                                         cell.setCellValue(value);
 78                                         cell.setCellStyle(style);
 79                                 }
 80                          }
 81                //添加尾部 备注
 82                  HSSFRow lastrow = sheet.createRow(data.size()+2);
 83                  HSSFCell cells=lastrow.createCell(0);
 84                  HSSFCellStyle styles=workbook.createCellStyle();
 85                        
 86                    styles.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
 87                    styles.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
 88                      HSSFFont font = workbook.createFont();
 89                         font.setFontName("仿宋");//设置字体名称
 90                         
 91                         font.setFontHeightInPoints((short)20);//设置字号
 92                        font.setColor(HSSFColor.RED.index);//设置字体颜色
 93                     
 94                     styles.setFont(font);
 95                  cells.setCellValue("备注:红色字体区域为不可更改主键。请不要修改,以免发生错误,谢谢!");
 96                  cells.setCellStyle(styles);
 97                  CellRangeAddress region=new CellRangeAddress(data.size()+2,data.size()+2, 0, cnlist.size());
 98                  sheet.addMergedRegion(region);
 99                  
100                 out=response.getOutputStream();
101                 // FileOutputStream out = new FileOutputStream(filePath);
102                 workbook.write(out);//保存Excel文件
103         } catch (IOException e) {
104             // TODO: handle exception
105             System.out.println("导出失败!");
106         }finally{
107             try {
108                 out.flush();
109                 out.close();//关闭文件流
110             } catch (Exception e) {
111                 // TODO: handle exception
112             }
113             
114         }
115         
116         
117          System.out.println("OK!");

导出效果图:

 

2.Excel的基本操作:

(1)创建Workbook和Sheet

  

public class Test00
{
 public static void main(String[] args) throws IOException
 {
 String filePath="d:\\users\\lizw\\桌面\\POI\\sample.xls";//文件路径
 HSSFWorkbook workbook = new HSSFWorkbook();//创建Excel文件(Workbook)
 HSSFSheet sheet = workbook.createSheet();//创建工作表(Sheet)
sheet = workbook.createSheet("Test");//创建工作表(Sheet)
 FileOutputStream out = new FileOutputStream(filePath);
workbook.write(out);//保存Excel文件
out.close();//关闭文件流
 System.out.println("OK!");
 }
}

 

(2)创建单元格

 

HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
HSSFRow row = sheet.createRow(0);// 创建行,从0开始
HSSFCell cell = row.createCell(0);// 创建行的单元格,也是从0开始
cell.setCellValue("李志伟");// 设置单元格内容
row.createCell(1).setCellValue(false);// 设置单元格内容,重载
row.createCell(2).setCellValue(new Date());// 设置单元格内容,重载
row.createCell(3).setCellValue(12.345);// 设置单元格内容,重载

 

(3)创建页眉和页脚

 

HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
HSSFHeader header =sheet.getHeader();//得到页眉
header.setLeft("页眉左边");
header.setRight("页眉右边");
header.setCenter("页眉中间");
HSSFFooter footer =sheet.getFooter();//得到页脚
footer.setLeft("页脚左边");
footer.setRight("页脚右边");
footer.setCenter("页脚中间");



也可以使用Office自带的标签定义,你可以通过HSSFHeader或HSSFFooter访问到它们,都是静态属性,列表如下:

HSSFHeader.tab &A 表名
HSSFHeader.file &F 文件名
HSSFHeader.startBold &B 粗体开始
HSSFHeader.endBold &B 粗体结束
HSSFHeader.startUnderline &U 下划线开始
HSSFHeader.endUnderline &U 下划线结束
HSSFHeader.startDoubleUnderline &E 双下划线开始
HSSFHeader.endDoubleUnderline &E 双下划线结束
HSSFHeader.time &T 时间
HSSFHeader.date &D 日期
HSSFHeader.numPages &N 总页面数
HSSFHeader.page &P 当前页号

 

 

(4)合并单元格

 

HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
HSSFRow row=sheet.createRow(0);
//合并列
HSSFCell cell=row.createCell(0);
cell.setCellValue("合并列");
CellRangeAddress region=new CellRangeAddress(0, 0, 0, 5);
sheet.addMergedRegion(region);
//合并行
cell=row.createCell(6);
cell.setCellValue("合并行");
region=new CellRangeAddress(0, 5, 6, 6);
sheet.addMergedRegion(region);

CellRangeAddress对象其实就是表示一个区域,其构造方法如下:CellRangeAddress(首行, 末行, 首列, 末列)


 

 

(5)单元格对齐

 

HSSFCell cell=row.createCell(0);
cell.setCellValue("单元格对齐");
HSSFCellStyle style=workbook.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
style.setWrapText(true);//自动换行
style.setIndention((short)5);//缩进
style.setRotation((short)60);//文本旋转,这里的取值是从-90到90,而不是0-180度。
cell.setCellStyle(style);
水平对齐相关参数

如果是左侧对齐就是 HSSFCellStyle.ALIGN_FILL;
如果是居中对齐就是 HSSFCellStyle.ALIGN_CENTER;
如果是右侧对齐就是 HSSFCellStyle.ALIGN_RIGHT;
如果是跨列举中就是 HSSFCellStyle.ALIGN_CENTER_SELECTION;
如果是两端对齐就是 HSSFCellStyle.ALIGN_JUSTIFY;
如果是填充就是 HSSFCellStyle.ALIGN_FILL;
     垂直对齐相关参数

如果是靠上就是 HSSFCellStyle.VERTICAL_TOP;
如果是居中就是 HSSFCellStyle.VERTICAL_CENTER;
如果是靠下就是 HSSFCellStyle.VERTICAL_BOTTOM;
如果是两端对齐就是 HSSFCellStyle.VERTICAL_JUSTIFY;

(6)设置字体

HSSFCell cell = row.createCell(1);
cell.setCellValue("设置字体");
HSSFCellStyle style = workbook.createCellStyle();
HSSFFont font = workbook.createFont();
font.setFontName("华文行楷");//设置字体名称
font.setFontHeightInPoints((short)28);//设置字号
font.setColor(HSSFColor.RED.index);//设置字体颜色
font.setUnderline(FontFormatting.U_SINGLE);//设置下划线
font.setTypeOffset(FontFormatting.SS_SUPER);//设置上标下标
font.setStrikeout(true);//设置删除线
style.setFont(font);
cell.setCellStyle(style);


下划线选项值:

单下划线 FontFormatting.U_SINGLE

双下划线 FontFormatting.U_DOUBLE

会计用单下划线 FontFormatting.U_SINGLE_ACCOUNTING

会计用双下划线 FontFormatting.U_DOUBLE_ACCOUNTING

无下划线 FontFormatting.U_NONE

     上标下标选项值:

上标 FontFormatting.SS_SUPER

下标 FontFormatting.SS_SUB

普通,默认值 FontFormatting.SS_NONE

(7)设置宽度和高度

HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
HSSFRow row = sheet.createRow(1);
HSSFCell cell = row.createCell(1);
cell.setCellValue("123456789012345678901234567890");
sheet.setColumnWidth(1, 31 * 256);//设置第一列的宽度是31个字符宽度,一个字符宽度占256
row.setHeightInPoints(50);//设置行的高度是50个点

 

 

 

 

本文章部分摘自  空谷幽澜  https://www.cnblogs.com/huajiezh/p/5467821.html

 

 

 

 

 

 

 

 

 

 

 

posted @ 2018-09-30 17:09  牧雨  阅读(654)  评论(0)    收藏  举报