其他分享
首页 > 其他分享> > POI生成Excel文件:Excel,工具类,背景色,边框,居中,合并单元格

POI生成Excel文件:Excel,工具类,背景色,边框,居中,合并单元格

作者:互联网

背景今天分配到任务,要导出很多表格,懒得一个个写导出代码,故准备写个工具类

工具类代码如下:

  1 package com.swyx.tools.utils.poi;
  2 
  3 import java.io.File;
  4 import java.io.FileOutputStream;
  5 import java.io.OutputStream;
  6 import java.util.List;
  7 import java.util.Map;
  8 
  9 import org.apache.poi.hssf.usermodel.HSSFCell;
 10 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
 11 import org.apache.poi.hssf.usermodel.HSSFPalette;
 12 import org.apache.poi.hssf.usermodel.HSSFRow;
 13 import org.apache.poi.hssf.usermodel.HSSFSheet;
 14 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 15 import org.apache.poi.ss.usermodel.BorderStyle;
 16 import org.apache.poi.ss.usermodel.FillPatternType;
 17 import org.apache.poi.ss.usermodel.HorizontalAlignment;
 18 import org.apache.poi.ss.util.CellRangeAddress;
 19 import org.apache.poi.ss.util.RegionUtil;
 20 
 21 /**
 22  * 
 23  * @author wangbaojun1992@163.com
 24  * @version poi version : 4.1.0
 25  */
 26 public class ExcelWriteUtil {
 27     
 28     /**
 29      * 
 30      * @param titleMape 标题行,为第一行标题内容与样式,参数Map<String,String>结构,字段如下:
 31      *         {
 32      *             value:内容值
 33      *             backgroundColor:背景色,为RGB颜色,3个色值以","隔开,默认"189,215,238"
 34      *         }
 35      * @param titleList 表头行,为第二行表头内容与样式,参数List<Map<String,String>>结构,字段如下:
 36      *         [
 37      *             {
 38      *                 value:内容值
 39      *                 backgroundColor:背景色,为RGB颜色,3个色值以","隔开,默认"189,215,238"
 40      *             }
 41      *         ]
 42      * @param contentList 内容,所有取值均被转换位String类型,参数List<List<String>>结构。
 43      * @param contentStyle 内容样式,参数为Map<String,String>结构,字段如下:
 44      *         {
 45      *             isZebra:内容区是否使用斑马线,枚举值:0是,1否,默认0
 46      *             zebraColor:斑马线颜色,为RGB颜色,3个色值以","隔开,默认"230,230,230"
 47      * @param dirName 缓存文件的文件夹的绝对路径
 48      * @param fileName 文件名,不要带后缀
 49      * @return
 50      * @throws Exception 
 51      */
 52     @SuppressWarnings("deprecation")
 53     public static String exportXlsExcel(Map<String, String> titleMape,List<Map<String, String>> titleList,List<List<String>> contentList,Map<String, String> contentStyle,String dirName,String fileName) throws Exception {
 54         //1.验证文件和文件夹名并创建Excel文件
 55         if(fileName == null || fileName.trim().equals("")) {
 56             throw new Exception("生成Excel文件异常:传入的文件名fileName不可为null、空字符串");
 57         }
 58         File parentDir = null;
 59         if(dirName == null || dirName.trim().equals("")) {
 60             throw new Exception("生成Excel文件异常:传入的文件夹名dirName不可为null、空字符串");
 61         }
 62         try {
 63             parentDir = new File(dirName);
 64             if(!parentDir.exists()) {
 65                 parentDir.mkdirs();
 66             }
 67         } catch (Exception e) {
 68             throw new Exception("生成Excel文件异常:传入的文件夹名dirName有误,dirName="+dirName);
 69         }finally {
 70             if(parentDir == null) {
 71                 throw new Exception("生成Excel文件异常:创建文件夹出错,dirName="+dirName);
 72             }
 73         }
 74         File excelFile = null;
 75         try {
 76             excelFile = new File(parentDir, fileName+".xls");
 77             if(excelFile.exists()) {
 78                 excelFile.delete();
 79             }
 80             excelFile.createNewFile();
 81         } catch (Exception e) {
 82             throw new Exception("生成Excel文件异常:生成File文件出错,fileName="+fileName);
 83         }finally {
 84             if(excelFile == null) {
 85                 throw new Exception("生成Excel文件异常:生成File文件出错,fileName="+fileName); 
 86             }
 87         }
 88         
 89         //2创建工作簿
 90         HSSFWorkbook wb=new HSSFWorkbook();
 91         HSSFSheet sheet=wb.createSheet();
 92         
 93         //3编辑标题
 94         //3.1标题样式
 95         HSSFCellStyle titleStyle=wb.createCellStyle();
 96         //3.1.1标题背景色
 97         HSSFPalette palette0_0 = wb.getCustomPalette();
 98         String backgroundColorStr0_0 = titleMape.get("backgroundColor");
 99         if(backgroundColorStr0_0 == null || backgroundColorStr0_0.trim().equals("")) {
100             backgroundColorStr0_0 = "189,215,238";
101         }
102         String[] backGroundColorStr0_0Strs = backgroundColorStr0_0.split(",");
103         if(backGroundColorStr0_0Strs.length != 3) {
104             backGroundColorStr0_0Strs = "189,215,238".split(",");
105         }
106         palette0_0.setColorAtIndex((short)9 ,(byte)new Integer(backGroundColorStr0_0Strs[0]).intValue(),(byte)(new Integer(backGroundColorStr0_0Strs[1]).intValue()),(byte)(new Integer(backGroundColorStr0_0Strs[2]).intValue()));
107         titleStyle.setFillForegroundColor((short)9 );
108         titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
109         //3.1.2标题合并单元格
110         // Region region1 = new Region(0, (short) 0, 0, (short) 6);//参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号 
111         CellRangeAddress rg0_0 = new CellRangeAddress(0,0,(short)0,(short)titleList.size()-1);
112         sheet.addMergedRegion(rg0_0);
113         //3.1.3标题边框
114         //TODO 此处合并单元格的边框样式没有生效,网络上一大堆复制黏贴的东西,试了很多未成功,头痛,暂时遗留该问题
115         //使用RegionUtil类为合并后的单元格添加边框
116         RegionUtil.setBorderBottom(BorderStyle.THIN, rg0_0, sheet); // 下边框
117         RegionUtil.setBorderLeft(BorderStyle.THIN, rg0_0, sheet); // 左边框
118         RegionUtil.setBorderRight(BorderStyle.THIN, rg0_0, sheet); // 有边框
119         RegionUtil.setBorderTop(BorderStyle.THIN, rg0_0, sheet); // 上边框
120         //3.1.4对齐
121         titleStyle.setAlignment(HorizontalAlignment.CENTER); //居中   
122        
123         //3.2写入标题
124         HSSFRow row0 = sheet.createRow(0);
125         HSSFCell cell0_0 = row0.createCell(0);
126         cell0_0.setCellValue(titleMape.get("value"));
127         cell0_0.setCellStyle(titleStyle);
128         
129         //4编辑表头
130         short fi = 11;
131         HSSFRow row1 = sheet.createRow(1);
132         for(int i = 0;i < titleList.size();i ++,fi++) {
133             Map<String, String> oneTitle = titleList.get(i);
134             //4.1当前列表头样式
135             HSSFCellStyle titleStyleI = wb.createCellStyle();
136             //4.1.1当前列表头背景色
137             HSSFPalette palette1_I = wb.getCustomPalette();
138             String backGroundColor1_I = oneTitle.get("backgroundColor");
139             if(backGroundColor1_I == null || backGroundColor1_I.trim().equals("")) {
140                 backGroundColor1_I = "189,215,238";
141             }
142             String[] backGroundColor1_IStrs = backGroundColor1_I.split(",");
143             if(backGroundColor1_IStrs.length != 3) {
144                 backGroundColor1_IStrs = "189,215,238".split(",");
145             }
146             palette1_I.setColorAtIndex(fi,(byte)(new Integer(backGroundColor1_IStrs[0]).intValue()),(byte)(new Integer(backGroundColor1_IStrs[1]).intValue()),(byte)(new Integer(backGroundColor1_IStrs[2]).intValue()));
147             titleStyleI.setFillPattern(FillPatternType.SOLID_FOREGROUND);
148             titleStyleI.setFillForegroundColor(fi);
149             //4.1.2当前列表头边框
150             titleStyleI.setBorderBottom(BorderStyle.THIN); //下边框
151             titleStyleI.setBorderLeft(BorderStyle.THIN);//左边框
152             titleStyleI.setBorderTop(BorderStyle.THIN);//上边框
153             titleStyleI.setBorderRight(BorderStyle.THIN);//右边框
154             //4.1.3对齐
155             titleStyleI.setAlignment(HorizontalAlignment.CENTER); //居中   
156             //4.2写入当前列表头
157             HSSFCell cell1_I = row1.createCell(i);
158             cell1_I.setCellValue(oneTitle.get("value"));
159             cell1_I.setCellStyle(titleStyleI);
160         }
161         
162         //5编辑内容区
163         //5.1准备样式
164         String isZebraStr = contentStyle.get("isZebra");
165         boolean isZebra = true;
166         if(isZebraStr != null && isZebraStr.equals("1")) {
167             isZebra = false;
168         }
169         //5.1.1斑马线行样式
170         HSSFCellStyle style1 = wb.createCellStyle();
171         //背景色
172         HSSFPalette paletteC = wb.getCustomPalette();
173         String backGroundColorC = contentStyle.get("zebraColor");
174         if(backGroundColorC == null || backGroundColorC.trim().equals("")) {
175             backGroundColorC = "230,230,230";
176         }
177         String[] backGroundColorCStrs = backGroundColorC.split(",");
178         if(backGroundColorCStrs.length != 3) {
179             backGroundColorCStrs = "230,230,230".split(",");
180         }
181         paletteC.setColorAtIndex((short)10 ,  (byte)(new Integer(backGroundColorCStrs[0]).intValue()),(byte)(new Integer(backGroundColorCStrs[1]).intValue()),(byte)(new Integer(backGroundColorCStrs[2]).intValue()));
182         style1.setFillPattern(FillPatternType.SOLID_FOREGROUND);
183         style1.setFillForegroundColor((short)10);
184         //边框
185         style1.setBorderBottom(BorderStyle.THIN); //下边框
186         style1.setBorderLeft(BorderStyle.THIN);//左边框
187         style1.setBorderTop(BorderStyle.THIN);//上边框
188         style1.setBorderRight(BorderStyle.THIN);//右边框
189         //5.1.2非斑马线行样式
190         HSSFCellStyle style0 = wb.createCellStyle();
191         //背景色
192         style0.setFillPattern(FillPatternType.SOLID_FOREGROUND);
193         //边框
194         style0.setBorderBottom(BorderStyle.THIN); //下边框
195         style0.setBorderLeft(BorderStyle.THIN);//左边框
196         style0.setBorderTop(BorderStyle.THIN);//上边框
197         style0.setBorderRight(BorderStyle.THIN);//右边框
198         
199         //5.2写入内容
200         for(int i = 0;i < contentList.size();i ++) {
201             List<String> contents = contentList.get(i);
202             HSSFRow rowI = sheet.createRow(i+2);
203             for(int j = 0;j < contents.size();j ++) {
204                 HSSFCell cellJ = rowI.createCell(j);
205                 cellJ.setCellValue(contents.get(j));
206                 if(i % 2 == 1) {
207                     if(isZebra) {
208                         cellJ.setCellStyle(style1);
209                     }else {
210                         cellJ.setCellStyle(style0);
211                     }
212                 }else {
213                     cellJ.setCellStyle(style0);
214                 }
215             }
216         }
217 
218         //6将文件输出
219         OutputStream ouputStream = null;
220         try {
221              ouputStream = new FileOutputStream(excelFile);
222              wb.write(ouputStream);
223              ouputStream.flush();
224              wb.close();
225         } catch (Exception e) {
226             throw new Exception("生成Excel文件异常:写出Excel文件异常"); 
227         }finally {
228             try {
229                 if(ouputStream != null) {
230                     ouputStream.close();
231                 }
232             } catch (Exception e2) {
233             }
234         }
235         
236         return excelFile.getAbsolutePath();
237     }
238 }

工具类调用:

 1 package com.swyx.tools.utils.poi;
 2 
 3 import java.util.ArrayList;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 
 8 public class ExcelWriteUtilTest {
 9     public static void main(String[] args) throws Exception {
10         exportXlsExcel_Test();
11     }
12 
13     private static void exportXlsExcel_Test() throws Exception {
14         Map<String, String> titleMape = new HashMap<String, String>();
15         titleMape.put("value", "生成Excel文件测试");
16         
17         List<Map<String, String>> titleList = new ArrayList<Map<String,String>>();
18         Map<String, String> tm1 = new HashMap<String, String>();
19         tm1.put("value", "第1列");
20         titleList.add(tm1);
21         Map<String, String> tm2 = new HashMap<String, String>();
22         tm2.put("value", "第2列");
23         titleList.add(tm2);
24         Map<String, String> tm3 = new HashMap<String, String>();
25         tm3.put("value", "第3列");
26         titleList.add(tm3);
27         Map<String, String> tm4 = new HashMap<String, String>();
28         tm4.put("value", "第4列");
29         titleList.add(tm4);
30         Map<String, String> tm5 = new HashMap<String, String>();
31         tm5.put("value", "第5列");
32         titleList.add(tm5);
33         Map<String, String> tm6 = new HashMap<String, String>();
34         tm6.put("value", "第6列");
35         titleList.add(tm6);
36         
37         List<List<String>> contentList = new ArrayList<List<String>>();
38         List<String> cl1 = new ArrayList<String>();
39         cl1.add("111111");cl1.add("111111");cl1.add("111111");cl1.add("111111");cl1.add("111111");cl1.add("111111");
40         contentList.add(cl1);
41         
42         List<String> cl2 = new ArrayList<String>();
43         cl2.add("222222");cl2.add("222222");cl2.add("222222");cl2.add("222222");cl2.add("222222");cl2.add("222222");
44         contentList.add(cl2);
45         
46         List<String> cl3 = new ArrayList<String>();
47         cl3.add("333333");cl3.add("333333");cl3.add("333333");cl3.add("333333");cl3.add("333333");cl3.add("333333");
48         contentList.add(cl3);
49         
50         List<String> cl4 = new ArrayList<String>();
51         cl4.add("444444");cl4.add("444444");cl4.add("444444");cl4.add("444444");cl4.add("444444");cl4.add("444444");
52         contentList.add(cl4);
53         
54         List<String> cl5 = new ArrayList<String>();
55         cl5.add("555555");cl5.add("555555");cl5.add("555555");cl5.add("555555");cl5.add("555555");cl5.add("555555");
56         contentList.add(cl5);
57         
58         List<String> cl6 = new ArrayList<String>();
59         cl6.add("666666");cl6.add("666666");cl6.add("666666");cl6.add("666666");cl6.add("666666");cl6.add("666666");
60         contentList.add(cl6);
61         
62         List<String> cl7 = new ArrayList<String>();
63         cl7.add("777777");cl7.add("777777");cl7.add("777777");cl7.add("777777");cl7.add("777777");cl7.add("777777");
64         contentList.add(cl7);
65         
66         List<String> cl8 = new ArrayList<String>();
67         cl8.add("888888");cl8.add("888888");cl8.add("888888");cl8.add("888888");cl8.add("888888");cl8.add("888888");
68         contentList.add(cl8);
69         
70         List<String> cl9 = new ArrayList<String>();
71         cl9.add("999999");cl9.add("999999");cl9.add("999999");cl9.add("999999");cl9.add("999999");cl9.add("999999");
72         contentList.add(cl9);
73         
74         Map<String, String> contentStyle = new HashMap<String, String>();
75         String dirName = "C:\\WorkSpaces\\dxc";
76         String fileName = "ExcelWriteUtil_exportXlsExcel_Test";
77         
78         String name = ExcelWriteUtil.exportXlsExcel(titleMape, titleList, contentList, contentStyle, dirName, fileName);
79         System.out.println(name);
80     }
81 }

生成Excel:

 

标签:List,单元格,Excel,边框,add,POI,import,new,BorderStyle
来源: https://www.cnblogs.com/ShouWangYiXin/p/10962176.html