excel poi 文件导出,支持多sheet、多列自动合并。

参考博客:

  http://www.oschina.net/code/snippet_565430_15074

  增加了多sheet,多列的自动合并。

  修改了部分过时方法和导出逻辑。

  优化了标题,导出信息等

先看下效果,如果正常导出是这样子:

  

自动合并后是:

  

动态图示例:

  

poi导出并不是一件很麻烦的事情,只是逻辑相对复杂,要考虑到各种情况。我把代码贴上,有用得到的可以帮助一下。

导出类:

  1 package com.centit.njld.commons.testexcel;
  2 
  3 import java.io.ByteArrayOutputStream;
  4 import java.text.SimpleDateFormat;
  5 import java.util.Date;
  6 import java.util.LinkedHashMap;
  7 import java.util.List;
  8 import java.util.Map.Entry;
  9 import java.util.Set;
 10 
 11 import org.apache.poi.hssf.usermodel.HSSFCell;
 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.CellStyle;
 16 import org.apache.poi.ss.usermodel.Font;
 17 import org.apache.poi.ss.usermodel.IndexedColors;
 18 import org.apache.poi.ss.util.CellRangeAddress;
 19 
 20 import com.centit.njld.commons.testexcel.TestExcel_Reflection;
 21 
 22 public class TestExcel_Export {
 23 
 24     private static HSSFWorkbook wb;
 25 
 26     private static CellStyle titleStyle; // 标题行样式
 27     private static Font titleFont; // 标题行字体
 28     private static CellStyle dateStyle; // 日期行样式
 29     private static Font dateFont; // 日期行字体
 30     private static CellStyle headStyle; // 表头行样式
 31     private static Font headFont; // 表头行字体
 32     private static CellStyle contentStyle; // 内容行样式
 33     private static Font contentFont; // 内容行字体
 34 
 35     /**
 36      * 导出文件
 37      */
 38     public static boolean export2File(ExcelExportData setInfo,
 39             String outputExcelFileName) throws Exception {
 40         return TestExcel_FileUtil.write(outputExcelFileName, export2ByteArray(setInfo),
 41                 true, true);
 42     }
 43 
 44     /**
 45      * 导出到byte数组
 46      */
 47     public static byte[] export2ByteArray(ExcelExportData setInfo)
 48             throws Exception {
 49         return export2Stream(setInfo).toByteArray();
 50     }
 51 
 52     /**
 53      * 导出到流
 54      */
 55     public static ByteArrayOutputStream export2Stream(ExcelExportData setInfo)
 56             throws Exception {
 57         init();
 58         
 59         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 60 
 61         Set<Entry<String, List<?>>> set = setInfo.getDataMap().entrySet();
 62         String[] sheetNames = new String[setInfo.getDataMap().size()];
 63         int sheetNameNum = 0;
 64         for (Entry<String, List<?>> entry : set) {
 65             sheetNames[sheetNameNum] = entry.getKey();
 66             sheetNameNum++;
 67         }
 68         HSSFSheet[] sheets = getSheets(setInfo.getDataMap().size(), sheetNames);
 69         int sheetNum = 0;
 70         int k = 0;
 71         
 72         for (Entry<String, List<?>> entry : set) {
 73             // Sheet
 74             List<?> objs = entry.getValue();
 75 
 76             // 标题行
 77             createTableTitleRow(setInfo, sheets, sheetNum);
 78 
 79             // 日期行
 80             createTableDateRow(setInfo, sheets, sheetNum);
 81 
 82             // 表头
 83             creatTableHeadRow(setInfo, sheets, sheetNum);
 84 
 85             // 表体
 86             String[] fieldNames = setInfo.getFieldNames().get(sheetNum);
 87             
 88             int rowNum = 3;
 89             for (Object obj : objs) {
 90                 HSSFRow contentRow = sheets[sheetNum].createRow(rowNum);
 91                 contentRow.setHeight((short) 300);
 92                 HSSFCell[] cells = getCells(contentRow, setInfo.getFieldNames().get(sheetNum).length);
 93                 int cellNum = 1; // 去掉一列序号,因此从1开始
 94                 if (fieldNames != null) {
 95                     for (int num = 0; num < fieldNames.length; num++) {
 96                         Object value = TestExcel_Reflection.invokeGetterMethod(obj,fieldNames[num]);
 97                         cells[cellNum].setCellValue(value == null ? "" : value.toString());
 98                         cellNum++;
 99                     }
100                 }
101                 rowNum++;
102             }
103             
104             k++;
105             String[] groupColumns = null;
106             if(setInfo.getGroupColumn().size()!=0){
107                 if(setInfo.getGroupColumn().size() >= k){
108                     groupColumns = setInfo.getGroupColumn().get(sheetNum);
109                 }
110             }
111             
112             if(groupColumns!=null){
113                 int n=0;
114                 for (int i = 0; i < groupColumns.length; i++) {
115                     
116                     String[] fieldName = setInfo.getFieldNames().get(sheetNum);
117                     for (int j = 0; j < fieldName.length; j++) {
118                         if(groupColumns[i].equals(fieldName[j])){
119                             j++;
120                             n=j;
121                             break;
122                         }
123                     }
124                     int x = 0;
125                     int y = 0;
126                     int z = 3;
127                     int m = objs.size();
128                     boolean flag = false;
129                     Object val = null;
130                     CellRangeAddress dateRange = null;
131                     for (Object obj : objs) {
132                         y++;
133                         Object value = TestExcel_Reflection.invokeGetterMethod(obj,groupColumns[i]);
134                         if(x==0){
135                             x++;
136                             val=value;
137                         }else if(val.toString().equals(value.toString())){
138                             x++;
139                             if(m==y){
140                                 dateRange = new CellRangeAddress(z, x+3, n, n);
141                                 sheets[sheetNum].addMergedRegion(dateRange);
142                             }
143                         }else{
144                             val=value;
145                             if(flag){
146                                 dateRange = new CellRangeAddress(z, x+3, n, n);
147                                 z=x+4;
148                                 x=x+1;
149                             }else{
150                                 dateRange = new CellRangeAddress(z, x+2, n, n);
151                                 z=x+3;
152                             }
153                             sheets[sheetNum].addMergedRegion(dateRange);
154                             flag=true;
155                         }
156                     }
157                 }
158             }
159             
160 //            CellRangeAddress dateRange = new CellRangeAddress(3, 10, 1, 1);
161 //            sheets[sheetNum].addMergedRegion(dateRange);
162 //            
163 //            CellRangeAddress aa = new CellRangeAddress(11, 15, 1, 1);
164 //            sheets[sheetNum].addMergedRegion(aa);
165 //            
166 //            CellRangeAddress bb = new CellRangeAddress(3, 5, 2, 2);
167 //            sheets[sheetNum].addMergedRegion(bb);
168             
169 //            
170 //            CellRangeAddress aaa = new CellRangeAddress(16, 18, 1, 1);
171 //            sheets[sheetNum].addMergedRegion(aaa);
172             
173             adjustColumnSize(sheets, sheetNum, fieldNames); // 自动调整列宽
174             sheetNum++;
175         }
176         wb.write(outputStream);
177         return outputStream;
178     }
179 
180     /**
181      * @Description: 初始化
182      */
183     private static void init() {
184         wb = new HSSFWorkbook();
185 
186         titleFont = wb.createFont();
187         titleStyle = wb.createCellStyle();
188         dateStyle = wb.createCellStyle();
189         dateFont = wb.createFont();
190         headStyle = wb.createCellStyle();
191         headFont = wb.createFont();
192         contentStyle = wb.createCellStyle();
193         contentFont = wb.createFont();
194 
195         initTitleCellStyle();
196         initTitleFont();
197         initDateCellStyle();
198         initDateFont();
199         initHeadCellStyle();
200         initHeadFont();
201         initContentCellStyle();
202         initContentFont();
203     }
204 
205     /**
206      * @Description: 自动调整列宽
207      */
208     private static void adjustColumnSize(HSSFSheet[] sheets, int sheetNum,
209             String[] fieldNames) {
210         for (int i = 0; i < fieldNames.length + 1; i++) {
211             sheets[sheetNum].autoSizeColumn(i, true);
212         }
213     }
214 
215     /**
216      * @Description: 创建标题行(需合并单元格)
217      */
218     private static void createTableTitleRow(ExcelExportData setInfo, HSSFSheet[] sheets, int sheetNum) {
219         CellRangeAddress titleRange = new CellRangeAddress(0, 0, 0, setInfo.getFieldNames().get(sheetNum).length);
220         sheets[sheetNum].addMergedRegion(titleRange);
221         HSSFRow titleRow = sheets[sheetNum].createRow(0);
222         titleRow.setHeight((short) 800);
223         HSSFCell titleCell = titleRow.createCell(0);
224         titleCell.setCellStyle(titleStyle);
225         titleCell.setCellValue(setInfo.getTitles()[sheetNum]);
226     }
227 
228     /**
229      * @Description: 创建日期行(需合并单元格)
230      */
231     private static void createTableDateRow(ExcelExportData setInfo,HSSFSheet[] sheets, int sheetNum) {
232         CellRangeAddress dateRange = new CellRangeAddress(1, 1, 0, setInfo.getFieldNames().get(sheetNum).length);
233         sheets[sheetNum].addMergedRegion(dateRange);
234         HSSFRow dateRow = sheets[sheetNum].createRow(1);
235         dateRow.setHeight((short) 350);
236         HSSFCell dateCell = dateRow.createCell(0);
237         dateCell.setCellStyle(dateStyle);
238         dateCell.setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
239     }
240 
241     /**
242      * @Description: 创建表头行(需合并单元格)
243      */
244     private static void creatTableHeadRow(ExcelExportData setInfo,
245             HSSFSheet[] sheets, int sheetNum) {
246         // 表头
247         HSSFRow headRow = sheets[sheetNum].createRow(2);
248         headRow.setHeight((short) 350);
249         // 序号列
250         HSSFCell snCell = headRow.createCell(0);
251         snCell.setCellStyle(headStyle);
252         snCell.setCellValue("序号");
253         // 列头名称
254         for (int num = 1, len = setInfo.getColumnNames().get(sheetNum).length; num <= len; num++) {
255             HSSFCell headCell = headRow.createCell(num);
256             headCell.setCellStyle(headStyle);
257             headCell.setCellValue(setInfo.getColumnNames().get(sheetNum)[num - 1]);
258         }
259     }
260 
261     /**
262      * @Description: 创建所有的Sheet
263      */
264     private static HSSFSheet[] getSheets(int num, String[] names) {
265         HSSFSheet[] sheets = new HSSFSheet[num];
266         for (int i = 0; i < num; i++) {
267             sheets[i] = wb.createSheet(names[i]);
268         }
269         return sheets;
270     }
271 
272     /**
273      * @Description: 创建内容行的每一列(附加一列序号)
274      */
275     private static HSSFCell[] getCells(HSSFRow contentRow, int num) {
276         HSSFCell[] cells = new HSSFCell[num + 1];
277 
278         for (int i = 0, len = cells.length; i < len; i++) {
279             cells[i] = contentRow.createCell(i);
280             cells[i].setCellStyle(contentStyle);
281         }
282 
283         // 设置序号列值,因为出去标题行和日期行,所有-2
284         cells[0].setCellValue(contentRow.getRowNum() - 2);
285 
286         return cells;
287     }
288 
289     /**
290      * @Description: 初始化标题行样式
291      */
292     private static void initTitleCellStyle() {
293         titleStyle.setAlignment(CellStyle.ALIGN_CENTER);
294         titleStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
295         titleStyle.setFont(titleFont);
296         titleStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.getIndex());
297     }
298 
299     /**
300      * @Description: 初始化日期行样式
301      */
302     private static void initDateCellStyle() {
303         dateStyle.setAlignment(CellStyle.ALIGN_CENTER_SELECTION);
304         dateStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
305         dateStyle.setFont(dateFont);
306         dateStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.getIndex());
307     }
308 
309     /**
310      * @Description: 初始化表头行样式
311      */
312     private static void initHeadCellStyle() {
313         headStyle.setAlignment(CellStyle.ALIGN_CENTER);
314         headStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
315         headStyle.setFont(headFont);
316         headStyle.setFillBackgroundColor(IndexedColors.YELLOW.getIndex());
317         headStyle.setBorderTop(CellStyle.BORDER_MEDIUM);
318         headStyle.setBorderBottom(CellStyle.BORDER_THIN);
319         headStyle.setBorderLeft(CellStyle.BORDER_THIN);
320         headStyle.setBorderRight(CellStyle.BORDER_THIN);
321         headStyle.setTopBorderColor(IndexedColors.BLUE.getIndex());
322         headStyle.setBottomBorderColor(IndexedColors.BLUE.getIndex());
323         headStyle.setLeftBorderColor(IndexedColors.BLUE.getIndex());
324         headStyle.setRightBorderColor(IndexedColors.BLUE.getIndex());
325     }
326 
327     /**
328      * @Description: 初始化内容行样式
329      */
330     private static void initContentCellStyle() {
331         contentStyle.setAlignment(CellStyle.ALIGN_CENTER);
332         contentStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
333         contentStyle.setFont(contentFont);
334         contentStyle.setBorderTop(CellStyle.BORDER_THIN);
335         contentStyle.setBorderBottom(CellStyle.BORDER_THIN);
336         contentStyle.setBorderLeft(CellStyle.BORDER_THIN);
337         contentStyle.setBorderRight(CellStyle.BORDER_THIN);
338         contentStyle.setTopBorderColor(IndexedColors.BLUE.getIndex());
339         contentStyle.setBottomBorderColor(IndexedColors.BLUE.getIndex());
340         contentStyle.setLeftBorderColor(IndexedColors.BLUE.getIndex());
341         contentStyle.setRightBorderColor(IndexedColors.BLUE.getIndex());
342         contentStyle.setWrapText(true); // 字段换行
343     }
344 
345     /**
346      * @Description: 初始化标题行字体
347      */
348     private static void initTitleFont() {
349         titleFont.setFontName("华文楷体");
350         titleFont.setFontHeightInPoints((short) 20);
351         titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
352         titleFont.setCharSet(Font.DEFAULT_CHARSET);
353         titleFont.setColor(IndexedColors.BLUE_GREY.getIndex());
354     }
355 
356     /**
357      * @Description: 初始化日期行字体
358      */
359     private static void initDateFont() {
360         dateFont.setFontName("隶书");
361         dateFont.setFontHeightInPoints((short) 10);
362         dateFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
363         dateFont.setCharSet(Font.DEFAULT_CHARSET);
364         dateFont.setColor(IndexedColors.BLUE_GREY.getIndex());
365     }
366 
367     /**
368      * @Description: 初始化表头行字体
369      */
370     private static void initHeadFont() {
371         headFont.setFontName("宋体");
372         headFont.setFontHeightInPoints((short) 10);
373         headFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
374         headFont.setCharSet(Font.DEFAULT_CHARSET);
375         headFont.setColor(IndexedColors.BLUE_GREY.getIndex());
376     }
377 
378     /**
379      * @Description: 初始化内容行字体
380      */
381     private static void initContentFont() {
382         contentFont.setFontName("宋体");
383         contentFont.setFontHeightInPoints((short) 10);
384         contentFont.setBoldweight(Font.BOLDWEIGHT_NORMAL);
385         contentFont.setCharSet(Font.DEFAULT_CHARSET);
386         contentFont.setColor(IndexedColors.BLUE_GREY.getIndex());
387     }
388 
389     /**
390      * Excel导出数据类
391      * @author jimmy
392      */
393     public static class ExcelExportData {
394 
395         /**
396          * 导出数据 key:String 表示每个Sheet的名称 value:List<?> 表示每个Sheet里的所有数据行
397          */
398         private LinkedHashMap<String, List<?>> dataMap;
399 
400         /**
401          * 每个Sheet里的顶部大标题
402          */
403         private String[] titles;
404 
405         /**
406          * 单个sheet里的数据列标题
407          */
408         private List<String[]> columnNames;
409 
410         /**
411          * 单个sheet里每行数据的列对应的对象属性名称
412          */
413         private List<String[]> fieldNames;
414 
415         private List<String[]> groupColumn;
416         
417         public List<String[]> getFieldNames() {
418             return fieldNames;
419         }
420 
421         public void setFieldNames(List<String[]> fieldNames) {
422             this.fieldNames = fieldNames;
423         }
424 
425         public String[] getTitles() {
426             return titles;
427         }
428 
429         public void setTitles(String[] titles) {
430             this.titles = titles;
431         }
432 
433         public List<String[]> getColumnNames() {
434             return columnNames;
435         }
436 
437         public void setColumnNames(List<String[]> columnNames) {
438             this.columnNames = columnNames;
439         }
440 
441         public LinkedHashMap<String, List<?>> getDataMap() {
442             return dataMap;
443         }
444 
445         public void setDataMap(LinkedHashMap<String, List<?>> dataMap) {
446             this.dataMap = dataMap;
447         }
448 
449         public List<String[]> getGroupColumn() {
450             return groupColumn;
451         }
452 
453         public void setGroupColumn(List<String[]> groupColumn) {
454             this.groupColumn = groupColumn;
455         }
456     }
457     
458 }
View Code

文件下载类:

  1 package com.centit.njld.commons.testexcel;
  2 
  3 import java.io.File;
  4 import java.io.FileInputStream;
  5 import java.io.FileOutputStream;
  6 import java.io.FilenameFilter;
  7 import java.io.IOException;
  8 import java.io.OutputStream;
  9 import java.io.RandomAccessFile;
 10 import java.util.ArrayList;
 11 import java.util.Arrays;
 12 import java.util.Collections;
 13 import java.util.Comparator;
 14 import java.util.List;
 15 import java.util.concurrent.ArrayBlockingQueue;
 16 import java.util.concurrent.ThreadPoolExecutor;
 17 import java.util.concurrent.TimeUnit;
 18 
 19 public class TestExcel_FileUtil {
 20 
 21     /**
 22      * 当前目录路径
 23      */
 24     public static String currentWorkDir = System.getProperty("user.dir") + "\\";
 25 
 26     /**
 27      * 左填充
 28      * 
 29      * @param str
 30      * @param length
 31      * @param ch
 32      * @return
 33      */
 34     public static String leftPad(String str, int length, char ch) {
 35         if (str.length() >= length) {
 36             return str;
 37         }
 38         char[] chs = new char[length];
 39         Arrays.fill(chs, ch);
 40         char[] src = str.toCharArray();
 41         System.arraycopy(src, 0, chs, length - src.length, src.length);
 42         return new String(chs);
 43 
 44     }
 45 
 46     /**
 47      * 删除文件
 48      * 
 49      * @param fileName
 50      *            待删除的完整文件名
 51      * @return
 52      */
 53     public static boolean delete(String fileName) {
 54         boolean result = false;
 55         File f = new File(fileName);
 56         if (f.exists()) {
 57             result = f.delete();
 58 
 59         } else {
 60             result = true;
 61         }
 62         return result;
 63     }
 64 
 65     /***
 66      * 递归获取指定目录下的所有的文件(不包括文件夹)
 67      * 
 68      * @param obj
 69      * @return
 70      */
 71     public static ArrayList<File> getAllFiles(String dirPath) {
 72         File dir = new File(dirPath);
 73 
 74         ArrayList<File> files = new ArrayList<File>();
 75 
 76         if (dir.isDirectory()) {
 77             File[] fileArr = dir.listFiles();
 78             for (int i = 0; i < fileArr.length; i++) {
 79                 File f = fileArr[i];
 80                 if (f.isFile()) {
 81                     files.add(f);
 82                 } else {
 83                     files.addAll(getAllFiles(f.getPath()));
 84                 }
 85             }
 86         }
 87         return files;
 88     }
 89 
 90     /**
 91      * 获取指定目录下的所有文件(不包括子文件夹)
 92      * 
 93      * @param dirPath
 94      * @return
 95      */
 96     public static ArrayList<File> getDirFiles(String dirPath) {
 97         File path = new File(dirPath);
 98         File[] fileArr = path.listFiles();
 99         ArrayList<File> files = new ArrayList<File>();
100 
101         for (File f : fileArr) {
102             if (f.isFile()) {
103                 files.add(f);
104             }
105         }
106         return files;
107     }
108 
109     /**
110      * 获取指定目录下特定文件后缀名的文件列表(不包括子文件夹)
111      * 
112      * @param dirPath
113      *            目录路径
114      * @param suffix
115      *            文件后缀
116      * @return
117      */
118     public static ArrayList<File> getDirFiles(String dirPath,
119             final String suffix) {
120         File path = new File(dirPath);
121         File[] fileArr = path.listFiles(new FilenameFilter() {
122             public boolean accept(File dir, String name) {
123                 String lowerName = name.toLowerCase();
124                 String lowerSuffix = suffix.toLowerCase();
125                 if (lowerName.endsWith(lowerSuffix)) {
126                     return true;
127                 }
128                 return false;
129             }
130 
131         });
132         ArrayList<File> files = new ArrayList<File>();
133 
134         for (File f : fileArr) {
135             if (f.isFile()) {
136                 files.add(f);
137             }
138         }
139         return files;
140     }
141 
142     /**
143      * 读取文件内容
144      * 
145      * @param fileName
146      *            待读取的完整文件名
147      * @return 文件内容
148      * @throws IOException
149      */
150     public static String read(String fileName) throws IOException {
151         File f = new File(fileName);
152         FileInputStream fs = new FileInputStream(f);
153         String result = null;
154         byte[] b = new byte[fs.available()];
155         fs.read(b);
156         fs.close();
157         result = new String(b);
158         return result;
159     }
160 
161     /**
162      * 写文件
163      * 
164      * @param fileName
165      *            目标文件名
166      * @param fileContent
167      *            写入的内容
168      * @return
169      * @throws IOException
170      */
171     public static boolean write(String fileName, String fileContent)
172             throws IOException {
173         return write(fileName, fileContent, true, true);
174     }
175 
176     /**
177      * 写文件
178      * 
179      * @param fileName
180      *            完整文件名(类似:/usr/a/b/c/d.txt)
181      * @param fileContent
182      *            文件内容
183      * @param autoCreateDir
184      *            目录不存在时,是否自动创建(多级)目录
185      * @param autoOverWrite
186      *            目标文件存在时,是否自动覆盖
187      * @return
188      * @throws IOException
189      */
190     public static boolean write(String fileName, String fileContent,
191             boolean autoCreateDir, boolean autoOverwrite) throws IOException {
192         return write(fileName, fileContent.getBytes(), autoCreateDir,
193                 autoOverwrite);
194     }
195 
196     /**
197      * 写文件
198      * 
199      * @param fileName
200      *            完整文件名(类似:/usr/a/b/c/d.txt)
201      * @param contentBytes
202      *            文件内容的字节数组
203      * @param autoCreateDir
204      *            目录不存在时,是否自动创建(多级)目录
205      * @param autoOverWrite
206      *            目标文件存在时,是否自动覆盖
207      * @return
208      * @throws IOException
209      */
210     public static boolean write(String fileName, byte[] contentBytes,
211             boolean autoCreateDir, boolean autoOverwrite) throws IOException {
212         boolean result = false;
213         if (autoCreateDir) {
214             createDirs(fileName);
215         }
216         if (autoOverwrite) {
217             delete(fileName);
218         }
219         File f = new File(fileName);
220         FileOutputStream fs = new FileOutputStream(f);
221         fs.write(contentBytes);
222         fs.flush();
223         fs.close();
224         result = true;
225         return result;
226     }
227 
228     /**
229      * 追加内容到指定文件
230      * 
231      * @param fileName
232      * @param fileContent
233      * @return
234      * @throws IOException
235      */
236     public static boolean append(String fileName, String fileContent)
237             throws IOException {
238         boolean result = false;
239         File f = new File(fileName);
240         if (f.exists()) {
241             RandomAccessFile rFile = new RandomAccessFile(f, "rw");
242             byte[] b = fileContent.getBytes();
243             long originLen = f.length();
244             rFile.setLength(originLen + b.length);
245             rFile.seek(originLen);
246             rFile.write(b);
247             rFile.close();
248         }
249         result = true;
250         return result;
251     }
252 
253     /**
254      * 拆分文件
255      * 
256      * @param fileName
257      *            待拆分的完整文件名
258      * @param byteSize
259      *            按多少字节大小拆分
260      * @return 拆分后的文件名列表
261      * @throws IOException
262      */
263     public List<String> splitBySize(String fileName, int byteSize)
264             throws IOException {
265         List<String> parts = new ArrayList<String>();
266         File file = new File(fileName);
267         int count = (int) Math.ceil(file.length() / (double) byteSize);
268         int countLen = (count + "").length();
269         ThreadPoolExecutor threadPool = new ThreadPoolExecutor(count,
270                 count * 3, 1, TimeUnit.SECONDS,
271                 new ArrayBlockingQueue<Runnable>(count * 2));
272 
273         for (int i = 0; i < count; i++) {
274             String partFileName = file.getPath() + "."
275                     + leftPad((i + 1) + "", countLen, '0') + ".part";
276             threadPool.execute(new SplitRunnable(byteSize, i * byteSize,
277                     partFileName, file));
278             parts.add(partFileName);
279         }
280         return parts;
281     }
282 
283     /**
284      * 合并文件
285      * 
286      * @param dirPath
287      *            拆分文件所在目录名
288      * @param partFileSuffix
289      *            拆分文件后缀名
290      * @param partFileSize
291      *            拆分文件的字节数大小
292      * @param mergeFileName
293      *            合并后的文件名
294      * @throws IOException
295      */
296     public void mergePartFiles(String dirPath, String partFileSuffix,
297             int partFileSize, String mergeFileName) throws IOException {
298         ArrayList<File> partFiles = TestExcel_FileUtil.getDirFiles(dirPath,
299                 partFileSuffix);
300         Collections.sort(partFiles, new FileComparator());
301 
302         RandomAccessFile randomAccessFile = new RandomAccessFile(mergeFileName,
303                 "rw");
304         randomAccessFile.setLength(partFileSize * (partFiles.size() - 1)
305                 + partFiles.get(partFiles.size() - 1).length());
306         randomAccessFile.close();
307 
308         ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
309                 partFiles.size(), partFiles.size() * 3, 1, TimeUnit.SECONDS,
310                 new ArrayBlockingQueue<Runnable>(partFiles.size() * 2));
311 
312         for (int i = 0; i < partFiles.size(); i++) {
313             threadPool.execute(new MergeRunnable(i * partFileSize,
314                     mergeFileName, partFiles.get(i)));
315         }
316 
317     }
318 
319     /**
320      * 根据文件名,比较文件
321      * 
322      * @author yjmyzz@126.com
323      * 
324      */
325     private class FileComparator implements Comparator<File> {
326         public int compare(File o1, File o2) {
327             return o1.getName().compareToIgnoreCase(o2.getName());
328         }
329     }
330 
331     /**
332      * 创建(多级)目录
333      * 
334      * @param filePath
335      *            完整的文件名(类似:/usr/a/b/c/d.xml)
336      */
337     public static void createDirs(String filePath) {
338         File file = new File(filePath);
339         File parent = file.getParentFile();
340         if (parent != null && !parent.exists()) {
341             parent.mkdirs();
342         }
343 
344     }
345 
346     /**
347      * 分割处理Runnable
348      * 
349      * @author yjmyzz@126.com
350      * 
351      */
352     private class SplitRunnable implements Runnable {
353         int byteSize;
354         String partFileName;
355         File originFile;
356         int startPos;
357 
358         public SplitRunnable(int byteSize, int startPos, String partFileName,
359                 File originFile) {
360             this.startPos = startPos;
361             this.byteSize = byteSize;
362             this.partFileName = partFileName;
363             this.originFile = originFile;
364         }
365 
366         public void run() {
367             RandomAccessFile rFile;
368             OutputStream os;
369             try {
370                 rFile = new RandomAccessFile(originFile, "r");
371                 byte[] b = new byte[byteSize];
372                 rFile.seek(startPos);// 移动指针到每“段”开头
373                 int s = rFile.read(b);
374                 os = new FileOutputStream(partFileName);
375                 os.write(b, 0, s);
376                 os.flush();
377                 os.close();
378             } catch (IOException e) {
379                 e.printStackTrace();
380             }
381         }
382     }
383 
384     /**
385      * 合并处理Runnable
386      * 
387      * @author yjmyzz@126.com
388      * 
389      */
390     private class MergeRunnable implements Runnable {
391         long startPos;
392         String mergeFileName;
393         File partFile;
394 
395         public MergeRunnable(long startPos, String mergeFileName, File partFile) {
396             this.startPos = startPos;
397             this.mergeFileName = mergeFileName;
398             this.partFile = partFile;
399         }
400 
401         public void run() {
402             RandomAccessFile rFile;
403             try {
404                 rFile = new RandomAccessFile(mergeFileName, "rw");
405                 rFile.seek(startPos);
406                 FileInputStream fs = new FileInputStream(partFile);
407                 byte[] b = new byte[fs.available()];
408                 fs.read(b);
409                 fs.close();
410                 rFile.write(b);
411                 rFile.close();
412             } catch (IOException e) {
413                 e.printStackTrace();
414             }
415         }
416     }
417 
418 }
View Code

反射类:

  1 package com.centit.njld.commons.testexcel;
  2 
  3 import java.lang.reflect.Field;
  4 import java.lang.reflect.InvocationTargetException;
  5 import java.lang.reflect.Method;
  6 import java.lang.reflect.Modifier;
  7 import java.lang.reflect.ParameterizedType;
  8 import java.lang.reflect.Type;
  9 import java.util.ArrayList;
 10 import java.util.Collection;
 11 import java.util.Date;
 12 import java.util.List;
 13 
 14 import org.apache.commons.beanutils.BeanUtils;
 15 import org.apache.commons.beanutils.ConvertUtils;
 16 import org.apache.commons.beanutils.PropertyUtils;
 17 import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
 18 import org.apache.commons.lang.StringUtils;
 19 import org.apache.commons.logging.Log;
 20 import org.apache.commons.logging.LogFactory;
 21 import org.springframework.util.Assert;
 22 
 23 /**
 24  * 反射工具类.
 25  * 
 26  * 提供访问私有变量,获取泛型类型Class, 提取集合中元素的属性, 转换字符串到对象等Util函数.
 27  * 
 28  */
 29 public class TestExcel_Reflection{
 30 
 31     private static Log logger = LogFactory.getLog(TestExcel_Reflection.class);
 32 
 33     static{
 34         DateLocaleConverter dc = new DateLocaleConverter();
 35         ConvertUtils.register(dc, Date.class);
 36     }
 37 
 38     /**
 39      * 调用Getter方法.
 40      */
 41     public static Object invokeGetterMethod(Object target, String propertyName){
 42         String getterMethodName = "get" + StringUtils.capitalize(propertyName);
 43         return invokeMethod(target, getterMethodName, new Class[] {},
 44                 new Object[] {});
 45     }
 46 
 47     /**
 48      * 调用Setter方法.使用value的Class来查找Setter方法.
 49      */
 50     public static void invokeSetterMethod(Object target, String propertyName,
 51             Object value){
 52         invokeSetterMethod(target, propertyName, value, null);
 53     }
 54 
 55     /**
 56      * 调用Setter方法.
 57      * 
 58      * @param propertyType 用于查找Setter方法,为空时使用value的Class替代.
 59      */
 60     public static void invokeSetterMethod(Object target, String propertyName,
 61             Object value, Class<?> propertyType){
 62         Class<?> type = propertyType != null ? propertyType : value.getClass();
 63         String setterMethodName = "set" + StringUtils.capitalize(propertyName);
 64         invokeMethod(target, setterMethodName, new Class[] { type },
 65                 new Object[] { value });
 66     }
 67 
 68     /**
 69      * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
 70      */
 71     public static Object getFieldValue(final Object object,
 72             final String fieldName){
 73         Field field = getDeclaredField(object, fieldName);
 74 
 75         if (field == null){
 76             throw new IllegalArgumentException("Could not find field ["
 77                     + fieldName + "] on target [" + object + "]");
 78         }
 79 
 80         makeAccessible(field);
 81 
 82         Object result = null;
 83         try{
 84             result = field.get(object);
 85         }
 86         catch (IllegalAccessException e){
 87             logger.error("不可能抛出的异常{}" + e.getMessage());
 88         }
 89         return result;
 90     }
 91 
 92     /**
 93      * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数.
 94      */
 95     public static void setFieldValue(final Object object,
 96             final String fieldName, final Object value){
 97         Field field = getDeclaredField(object, fieldName);
 98 
 99         if (field == null){
100             throw new IllegalArgumentException("Could not find field ["
101                     + fieldName + "] on target [" + object + "]");
102         }
103 
104         makeAccessible(field);
105 
106         try{
107             field.set(object, value);
108         }
109         catch (IllegalAccessException e){
110             logger.error("不可能抛出的异常:{}" + e.getMessage());
111         }
112     }
113 
114     /**
115      * 直接调用对象方法, 无视private/protected修饰符.
116      */
117     public static Object invokeMethod(final Object object,
118             final String methodName, final Class<?>[] parameterTypes,
119             final Object[] parameters){
120         Method method = getDeclaredMethod(object, methodName, parameterTypes);
121         if (method == null){
122             throw new IllegalArgumentException("Could not find method ["
123                     + methodName + "] parameterType " + parameterTypes
124                     + " on target [" + object + "]");
125         }
126 
127         method.setAccessible(true);
128 
129         try{
130             return method.invoke(object, parameters);
131         }
132         catch (Exception e){
133             throw convertReflectionExceptionToUnchecked(e);
134         }
135     }
136 
137     /**
138      * 循环向上转型, 获取对象的DeclaredField.
139      * 
140      * 如向上转型到Object仍无法找到, 返回null.
141      */
142     protected static Field getDeclaredField(final Object object,
143             final String fieldName){
144         Assert.notNull(object, "object不能为空");
145         Assert.hasText(fieldName, "fieldName");
146         for (Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass
147                 .getSuperclass()){
148             try{
149                 return superClass.getDeclaredField(fieldName);
150             }
151             catch (NoSuchFieldException e){// NOSONAR
152                 // Field不在当前类定义,继续向上转型
153             }
154         }
155         return null;
156     }
157 
158     /**
159      * 强行设置Field可访问.
160      */
161     protected static void makeAccessible(final Field field){
162         if (!Modifier.isPublic(field.getModifiers())
163                 || !Modifier.isPublic(field.getDeclaringClass().getModifiers())){
164             field.setAccessible(true);
165         }
166     }
167 
168     /**
169      * 循环向上转型, 获取对象的DeclaredMethod.
170      * 
171      * 如向上转型到Object仍无法找到, 返回null.
172      */
173     protected static Method getDeclaredMethod(Object object, String methodName,
174             Class<?>[] parameterTypes){
175         Assert.notNull(object, "object不能为空");
176 
177         for (Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass
178                 .getSuperclass()){
179             try{
180                 return superClass.getDeclaredMethod(methodName, parameterTypes);
181             }
182             catch (NoSuchMethodException e){// NOSONAR
183                 // Method不在当前类定义,继续向上转型
184             }
185         }
186         return null;
187     }
188 
189     /**
190      * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. 如无法找到, 返回Object.class. eg. public UserDao
191      * extends HibernateDao<User>
192      * 
193      * @param clazz The class to introspect
194      * @return the first generic declaration, or Object.class if cannot be
195      * determined
196      */
197     @SuppressWarnings("unchecked")
198     public static <T> Class<T> getSuperClassGenricType(final Class clazz){
199         return getSuperClassGenricType(clazz, 0);
200     }
201 
202     /**
203      * 通过反射, 获得定义Class时声明的父类的泛型参数的类型. 如无法找到, 返回Object.class.
204      * 
205      * 如public UserDao extends HibernateDao<User,Long>
206      * 
207      * @param clazz clazz The class to introspect
208      * @param index the Index of the generic ddeclaration,start from 0.
209      * @return the index generic declaration, or Object.class if cannot be
210      * determined
211      */
212     @SuppressWarnings("unchecked")
213     public static Class getSuperClassGenricType(final Class clazz,
214             final int index){
215         Type genType = clazz.getGenericSuperclass();
216 
217         if (!(genType instanceof ParameterizedType)){
218             logger.warn(clazz.getSimpleName()
219                     + "'s superclass not ParameterizedType");
220             return Object.class;
221         }
222 
223         Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
224 
225         if (index >= params.length || index < 0){
226             logger.warn("Index: " + index + ", Size of "
227                     + clazz.getSimpleName() + "'s Parameterized Type: "
228                     + params.length);
229             return Object.class;
230         }
231         if (!(params[index] instanceof Class)){
232             logger.warn(clazz.getSimpleName()
233                     + " not set the actual class on superclass generic parameter");
234             return Object.class;
235         }
236 
237         return (Class) params[index];
238     }
239 
240     /**
241      * 提取集合中的对象的属性(通过getter函数), 组合成List.
242      * 
243      * @param collection 来源集合.
244      * @param propertyName 要提取的属性名.
245      */
246     @SuppressWarnings("unchecked")
247     public static List convertElementPropertyToList(
248             final Collection collection, final String propertyName){
249         List list = new ArrayList();
250 
251         try{
252             for (Object obj : collection){
253                 list.add(PropertyUtils.getProperty(obj, propertyName));
254             }
255         }
256         catch (Exception e){
257             throw convertReflectionExceptionToUnchecked(e);
258         }
259 
260         return list;
261     }
262 
263     /**
264      * 提取集合中的对象的属性(通过getter函数), 组合成由分割符分隔的字符串.
265      * 
266      * @param collection 来源集合.
267      * @param propertyName 要提取的属性名.
268      * @param separator 分隔符.
269      */
270     @SuppressWarnings("unchecked")
271     public static String convertElementPropertyToString(
272             final Collection collection, final String propertyName,
273             final String separator){
274         List list = convertElementPropertyToList(collection, propertyName);
275         return StringUtils.join(list, separator);
276     }
277 
278     /**
279      * 转换字符串到相应类型.
280      * 
281      * @param value 待转换的字符串
282      * @param toType 转换目标类型
283      */
284     @SuppressWarnings("unchecked")
285     public static <T> T convertStringToObject(String value, Class<T> toType){
286         try{
287             return (T) ConvertUtils.convert(value, toType);
288         }
289         catch (Exception e){
290             throw convertReflectionExceptionToUnchecked(e);
291         }
292     }
293 
294     /**
295      * 将反射时的checked exception转换为unchecked exception.
296      */
297     public static RuntimeException convertReflectionExceptionToUnchecked(
298             Exception e){
299         return convertReflectionExceptionToUnchecked(null, e);
300     }
301 
302     public static RuntimeException convertReflectionExceptionToUnchecked(
303             String desc, Exception e){
304         desc = (desc == null) ? "Unexpected Checked Exception." : desc;
305         if (e instanceof IllegalAccessException
306                 || e instanceof IllegalArgumentException
307                 || e instanceof NoSuchMethodException){
308             return new IllegalArgumentException(desc, e);
309         }
310         else if (e instanceof InvocationTargetException){
311             return new RuntimeException(desc, ((InvocationTargetException) e)
312                     .getTargetException());
313         }
314         else if (e instanceof RuntimeException){
315             return (RuntimeException) e;
316         }
317         return new RuntimeException(desc, e);
318     }
319 
320     public static final <T> T getNewInstance(Class<T> cls)
321     {
322         try{
323             return cls.newInstance();
324         }
325         catch (InstantiationException e){
326             e.printStackTrace();
327         }
328         catch (IllegalAccessException e){
329             e.printStackTrace();
330         }
331         return null;
332     }
333 
334     /**
335      * 拷贝 source 指定的porperties 属性 到 dest中
336      * 
337      * @return void
338      * @throws InvocationTargetException
339      * @throws IllegalAccessException
340      */
341     public static void copyPorperties(Object dest, Object source,
342             String[] porperties) throws InvocationTargetException,
343             IllegalAccessException{
344         for (String por : porperties){
345             Object srcObj = invokeGetterMethod(source, por);
346             if (srcObj != null){
347                 try{
348                     BeanUtils.setProperty(dest, por, srcObj);
349                 }
350                 catch (IllegalArgumentException e){
351                     e.printStackTrace();
352                 }
353                 catch (IllegalAccessException e){
354                     throw e;
355                 }
356                 catch (InvocationTargetException e){
357                     throw e;
358                 }
359             }
360         }
361     }
362 
363     /**
364      * 两者属性名一致时,拷贝source里的属性到dest里
365      * 
366      * @return void
367      * @throws IllegalAccessException
368      * @throws InvocationTargetException
369      */
370     @SuppressWarnings("unchecked")
371     public static void copyPorperties(Object dest, Object source)
372             throws IllegalAccessException, InvocationTargetException{
373         Class srcCla = source.getClass();
374         Field[] fsF = srcCla.getDeclaredFields();
375 
376         for (Field s : fsF){
377             String name = s.getName();
378             Object srcObj = invokeGetterMethod(source, name);
379             try{
380                 BeanUtils.setProperty(dest, name, srcObj);
381             }
382             catch (IllegalArgumentException e){
383                 e.printStackTrace();
384             }
385             catch (IllegalAccessException e){
386                 throw e;
387             }
388             catch (InvocationTargetException e){
389                 throw e;
390             }
391         }
392         // BeanUtils.copyProperties(dest, orig);
393     }
394 
395 
396 }
View Code

测试数据模型类:

 1 package com.centit.njld.commons.testexcel;
 2 public class TestExcel_Model {
 3 
 4     public TestExcel_Model() {
 5         super();
 6     }
 7 
 8     public TestExcel_Model(String unit, String mtName, int jhsl, int qlsl,
 9             int xhsl) {
10         super();
11         this.unit = unit;
12         this.mtName = mtName;
13         this.jhsl = jhsl;
14         this.qlsl = qlsl;
15         this.xhsl = xhsl;
16     }
17 
18     private String unit;
19 
20     private String mtName;
21     
22     private int jhsl;
23     
24     private int qlsl;
25     
26     private int xhsl;
27 
28     public String getUnit() {
29         return unit;
30     }
31 
32     public void setUnit(String unit) {
33         this.unit = unit;
34     }
35 
36     public String getMtName() {
37         return mtName;
38     }
39 
40     public void setMtName(String mtName) {
41         this.mtName = mtName;
42     }
43 
44     public int getJhsl() {
45         return jhsl;
46     }
47 
48     public void setJhsl(int jhsl) {
49         this.jhsl = jhsl;
50     }
51 
52     public int getQlsl() {
53         return qlsl;
54     }
55 
56     public void setQlsl(int qlsl) {
57         this.qlsl = qlsl;
58     }
59 
60     public int getXhsl() {
61         return xhsl;
62     }
63 
64     public void setXhsl(int xhsl) {
65         this.xhsl = xhsl;
66     }
67     
68 }
View Code

测试方法

 1 package com.centit.njld.commons.testexcel;
 2 
 3 import java.util.ArrayList;
 4 import java.util.LinkedHashMap;
 5 import java.util.List;
 6 import java.util.Random;
 7 
 8 import com.centit.njld.commons.testexcel.TestExcel_Export.ExcelExportData;
 9 
10 public class TestExcel_Main {
11 
12     private static List<TestExcel_Model> getData1() {
13         List<TestExcel_Model> data = new ArrayList<TestExcel_Model>();
14         Random rand = new Random();
15         data.add(new TestExcel_Model("城南维护所", "a",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
16         data.add(new TestExcel_Model("城南维护所", "a",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
17         data.add(new TestExcel_Model("城南维护所", "a",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
18         data.add(new TestExcel_Model("城南维护所", "d",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
19         data.add(new TestExcel_Model("城南维护所", "d",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
20         data.add(new TestExcel_Model("城南维护所", "f",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
21         data.add(new TestExcel_Model("城南维护所", "g",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
22         data.add(new TestExcel_Model("城南维护所", "---以上是城南所---",    rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
23         
24         data.add(new TestExcel_Model("什么鬼", "呵呵呵",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
25         data.add(new TestExcel_Model("什么鬼", "呵呵呵",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
26         data.add(new TestExcel_Model("什么鬼", "哈哈哈",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
27         data.add(new TestExcel_Model("什么鬼", "噗噗噗",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
28         data.add(new TestExcel_Model("什么鬼", "噗噗噗",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
29         data.add(new TestExcel_Model("什么鬼", "---以上是什么鬼---",    rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
30         
31         data.add(new TestExcel_Model("000", "asasasa",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
32         data.add(new TestExcel_Model("000", "dfdfdfd",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
33         data.add(new TestExcel_Model("000", "gggggg",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
34         data.add(new TestExcel_Model("000", "vvvvvv",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
35         data.add(new TestExcel_Model("000", "888888",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
36         data.add(new TestExcel_Model("000", "---以上是000---",    rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
37         
38         data.add(new TestExcel_Model("亮化所", "11111",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
39         data.add(new TestExcel_Model("亮化所", "11111",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
40         data.add(new TestExcel_Model("亮化所", "11111",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
41         data.add(new TestExcel_Model("亮化所", "---以上是亮化所---",    rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
42         
43         return data;
44     }
45     
46     private static List<TestExcel_Model> getData2() {
47         List<TestExcel_Model> data = new ArrayList<TestExcel_Model>();
48         Random rand = new Random();
49         data.add(new TestExcel_Model("城南维护所", "111111",            rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
50         data.add(new TestExcel_Model("城南维护所", "111111",            rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
51         data.add(new TestExcel_Model("城南维护所", "333333",            rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
52         data.add(new TestExcel_Model("城南维护所", "---以上是城南--",rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
53 
54         data.add(new TestExcel_Model("亮化所", "---以上是亮化--",    rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));    
55         data.add(new TestExcel_Model("亮化所", "150W",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
56         data.add(new TestExcel_Model("亮化所", "22.2W",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
57         data.add(new TestExcel_Model("亮化所", "95W",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
58         data.add(new TestExcel_Model("亮化所", "95W",                rand.nextInt(100),rand.nextInt(100),rand.nextInt(100)));
59         return data;
60     }
61     
62     public static void main(String[] args) throws Exception {
63         List<String[]> columNames = new ArrayList<String[]>();
64         columNames.add(new String[] { "部门", "材料名称","计划数量","请领数量","消耗数量" });
65         columNames.add(new String[] { "部门", "材料名称","计划数量","请领数量","消耗数量" });
66         List<String[]> fieldNames = new ArrayList<String[]>();
67         fieldNames.add(new String[] { "unit", "mtName","jhsl","qlsl","xhsl" });
68         fieldNames.add(new String[] { "unit", "mtName","jhsl","qlsl","xhsl" });
69         List<String[]> groupNames = new ArrayList<String[]>();
70         groupNames.add(new String[] { "unit", "mtName" });
71         groupNames.add(new String[] { "unit", "mtName" });
72         
73         LinkedHashMap<String, List<?>> dataMap = new LinkedHashMap<String, List<?>>();
74         dataMap.put("1-sheet", getData1());
75         dataMap.put("2-sheet", getData2());
76         
77         ExcelExportData setInfo = new ExcelExportData();
78         setInfo.setDataMap(dataMap);
79         setInfo.setFieldNames(fieldNames);
80         setInfo.setTitles(new String[] { "Name-1", "Name-2" });
81         setInfo.setGroupColumn(groupNames);
82         setInfo.setColumnNames(columNames);
83 
84         System.out.println(TestExcel_Export.export2File(setInfo, "D:/ywwwwwwwwwwwwwwwww.xls"));
85     }
86     
87 }
View Code

最重要部分要看

  

 

posted @ 2016-06-29 15:37  江湖危险快点跑  阅读(2816)  评论(0编辑  收藏  举报