赞
踩
- import java.io.BufferedInputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.lang.reflect.Field;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- import javax.servlet.http.HttpServletResponse;
-
- import org.apache.poi.hssf.usermodel.HSSFCell;
- import org.apache.poi.hssf.usermodel.HSSFRow;
- import org.apache.poi.hssf.usermodel.HSSFSheet;
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-
- import jxl.Workbook;
- import jxl.format.Alignment;
- import jxl.format.Border;
- import jxl.format.BorderLineStyle;
- import jxl.read.biff.BiffException;
- import jxl.write.Label;
- import jxl.write.WritableCellFormat;
- import jxl.write.WritableFont;
- import jxl.write.WritableImage;
- import jxl.write.WritableSheet;
- import jxl.write.WritableWorkbook;
- import jxl.write.WriteException;
-
- public class ExcelUtil {
- private static WritableSheet sheet = null;
- private static WritableSheet sheetToMap = null;
- private static WritableSheet sheetToMerge = null;
- private static Workbook rwork = null ;
- private static WritableWorkbook wwb = null ;
- private static Map<String,String> indexMap = null ;
-
- /**
- * @param 用来代替传统的使用IReport生成Excel
- * @param jxl操作excel1
- * @param 只替换Paremeter的值
- * @param 2012-03-23
- * @param List的值和顺序完全按照Bean的属性和值来排列的,如果需要修改排列顺序,那么请修改Bean属性的排列顺序
- * @param String realPath :读取模版路径
- * @param String outPath :输出模版路径
- * @param Map<String,String> map :需要替换的Parameter
- * @return
- * */
- public static void jExcelTemplate(String realPath,Map<String,String> map,HttpServletResponse response) {
- try {
- jxlDocTemplateAll(realPath,map,null,0,0,null,null,response) ;
- } catch (WriteException e) {
- e.printStackTrace();
- }
- }
-
- /**
- * @param 用来代替传统的使用IReport生成Excel
- * @param jxl操作excel1
- * @param 只替换List的值
- * @param List的值和顺序完全按照Bean的属性和值来排列的,如果需要修改排列顺序,那么请修改Bean属性的排列顺序
- * @param 需要设置坐标,即List循环的起始坐标
- * @param 2012-03-23
- * @param String realPath :读取模版路径
- * @param String outPath :输出模版路径
- * @param List<?> list :循环任意类型的List
- * @param list可以没有指定的泛型,但必须是指定的Model
- * @param list必须要指定初始化的坐标
- * @return
- * */
- public static void jExcelTemplate(String realPath,List<?> list,int x,int y,HttpServletResponse response) {
- try {
- jxlDocTemplateAll(realPath,null,list,x,y,null,null,response) ;
- } catch (WriteException e) {
- e.printStackTrace();
- }
- }
-
- /**
- * @param 用来代替传统的使用IReport生成Excel
- * @param jxl操作excel1
- * @param 2012-03-23
- * @param 替换Paremeter和List的值
- * @param Paremeter即传如的Map<String,String>,且必须的String类型的
- * @param Paremeter必须且最少有一个和模版上的值对应上,否则会报错
- * @param List的值和顺序完全按照Bean的属性和值来排列的,如果需要修改排列顺序,那么请修改Bean属性的排列顺序
- * @param 需要设置坐标,即List循环的起始坐标
- * @param String realPath :读取模版路径
- * @param String outPath :输出模版路径
- * @param Map<String,String> map :需要替换的Parameter
- * @param List<?> list :循环任意类型的List
- * @param list可以没有指定的泛型,但必须是指定的Model
- * @param list必须要指定初始化的坐标
- * @return
- * */
- public static void jExcelTemplate(String realPath,Map<String,String> map,List<?> list,int x,int y,HttpServletResponse response) {
- try {
- jxlDocTemplateAll(realPath,map,list,x,y,null,null,response) ;
- } catch (WriteException e) {
- e.printStackTrace();
- }
- }
-
- /**
- * @param 用来代替传统的使用IReport生成Excel
- * @param jxl操作excel1
- * @param 2012-03-23
- * @param 替换Paremeter和List的值,指定合并的单元格
- * @param Paremeter即传如的Map<String,String>,且必须的String类型的
- * @param Paremeter必须且最少有一个和模版上的值对应上,否则会报错
- * @param List的值和顺序完全按照Bean的属性和值来排列的,如果需要修改排列顺序,那么请修改Bean属性的排列顺序
- * @param 需要设置坐标,即List循环的起始坐标
- * @param String realPath :读取模版路径
- * @param String outPath :输出模版路径
- * @param Map<String,String> map :需要替换的Parameter
- * @param List<?> list :循环任意类型的List
- * @param list可以没有指定的泛型,但必须是指定的Model
- * @param list必须要指定初始化的坐标
- * @param 允许合并多个单元格,并且属性是居中,自动换行的
- * @param 合并的单元格如果想替换成指定内容,需要对传入的List<JXLExcelModel> 中 JXLExcelModel.mergeText赋值
- * @return
- * */
- public static void jExcelTemplate(String realPath,Map<String,String> map,List<?> list,int x,int y,List<JXLExcelModel> jxlList,HttpServletResponse response) {
- try {
- jxlDocTemplateAll(realPath,map,list,x,y,jxlList,null,response) ;
- } catch (WriteException e) {
- e.printStackTrace();
- }
- }
-
- /**
- * @param 用来代替传统的使用IReport生成Excel
- * @param jxl操作excel1
- * @param 2012-03-23
- * @param 替换Paremeter和List的值,指定合并的单元格
- * @param Paremeter即传如的Map<String,String>,且必须的String类型的
- * @param Paremeter必须且最少有一个和模版上的值对应上,否则会报错
- * @param List的值和顺序完全按照Bean的属性和值来排列的,如果需要修改排列顺序,那么请修改Bean属性的排列顺序
- * @param 需要设置坐标,即List循环的起始坐标
- * @param String realPath :读取模版路径
- * @param String outPath :输出模版路径
- * @param Map<String,String> map :需要替换的Parameter
- * @param List<?> list :循环任意类型的List
- * @param list可以没有指定的泛型,但必须是指定的Model
- * @param list必须要指定初始化的坐标
- * @param 允许合并多个单元格,并且属性是居中,自动换行的
- * @param 合并的单元格如果想替换成指定内容,需要对传入的List<JXLExcelModel> 中 JXLExcelModel.mergeText赋值
- * @return
- * */
- public static void jExcelTemplate(String realPath,Map<String,String> map,List<?> list,int x,int y,List<JXLExcelModel> jxlList,int[][] mergeInt,HttpServletResponse response) {
- try {
- jxlDocTemplateAll(realPath,map,list,x,y,jxlList,mergeInt,response) ;
- } catch (WriteException e) {
- e.printStackTrace();
- }
- }
-
- /**
- * @param 用来代替传统的使用IReport生成Excel
- * @param jxl操作excel1
- * @param 操作List,Map,合并单元格,合并单元格填充的值
- * @param List的值和顺序完全按照Bean的属性和值来排列的,如果需要修改排列顺序,那么请修改Bean属性的排列顺序
- * @param String realPath :读取模版路径
- * @param String outPath :输出模版路径
- * @param Map<String,String> map :需要替换的Parameter
- * @param List<?> list :循环任意类型的List
- * @param list可以没有指定的泛型,但必须是指定的Model
- * @param list必须要指定初始化的坐标
- * @param 允许合并多个单元格,并且属性是居中,自动换行的
- * @param 合并的单元格如果想替换成指定内容,需要对传入的List<JXLExcelModel> 中 JXLExcelModel.mergeText赋值
- * @return
- * */
- public static void jExcelTemplate(String realPath,Map<String,String> map,List<?> list,List<JXLExcelModel> jxlList,HttpServletResponse response) {
- try {
- jxlDocTemplateAllMoreList(realPath,map,list,jxlList,null,response) ;
- } catch (WriteException e) {
- e.printStackTrace();
- }
- }
-
- /**
- * @param 用来代替传统的使用IReport生成Excel
- * @param jxl操作excel1
- * @param 操作List,Map,合并单元格,合并单元格填充的值
- * @param List的值和顺序完全按照Bean的属性和值来排列的,如果需要修改排列顺序,那么请修改Bean属性的排列顺序
- * @param String realPath :读取模版路径
- * @param String outPath :输出模版路径
- * @param Map<String,String> map :需要替换的Parameter
- * @param List<?> list :循环任意类型的List
- * @param list可以没有指定的泛型,但必须是指定的Model
- * @param list必须要指定初始化的坐标
- * @param 允许合并多个单元格,并且属性是居中,自动换行的
- * @param 合并的单元格如果想替换成指定内容,需要对传入的List<JXLExcelModel> 中 JXLExcelModel.mergeText赋值
- * @param int[][] mergeInt :对指定列的上下行进行合并
- * @return
- * */
- public static void jExcelTemplate(String realPath,Map<String,String> map,List<?> list,List<JXLExcelModel> jxlList,int[] [] mergeInt,HttpServletResponse response) {
- try {
- jxlDocTemplateAllMoreList(realPath,map,list,jxlList,mergeInt,response) ;
- } catch (WriteException e) {
- e.printStackTrace();
- }
- }
-
- /*
- * 2012-03-23
- * 这个方法能遍历多个List表格
- * */
- @SuppressWarnings("unchecked")
- public static void jxlDocTemplateAllMoreList(String realPath,Map<String,String> map,List<?> list,List<JXLExcelModel> jxlList,int[][] mergeInt,HttpServletResponse response) throws WriteException {
- try {
- String outPath = realPath.substring(0, realPath.length() - 4) + "_bak.xls" ;
- boolean merge = false ; //判断是否有单元格要进行合并
- if(jxlList != null) {
- merge = true ;
- }
- if(fileExist(realPath)) {
- //1.找到模版文件并加载
- HSSFWorkbook rwb = new HSSFWorkbook(new FileInputStream(realPath)) ;
-
- //2.得到要修改的Parameter,并记录坐标 开始-------------------------
- HSSFSheet sht = rwb.getSheetAt(0) ;
- Map<String,String> indexMap = new HashMap<String,String>() ;
- /*
- * 判断是否有需要替换的Paremeter
- * 通过map来遍历得到要替换对象在excel中的坐标并保存在(indexMap)坐标map中
- * 格式 x|y
- * */
- if(map != null) {
- String indexList = "" ;
- for(String value:map.keySet()) {//遍历是否存在要替换的Parameter坐标,并记录在Map中 格式: x|y
- try {
- indexList = getCellindex(sht, value) ;
- //cell = getCellindex(sht, value);
- } catch(java.lang.RuntimeException e) {
- continue ;
- }
- indexMap.put(value, indexList) ;
- }
- }
- //2.得到要修改的Parameter,并记录坐标 结束-------------------------
-
- //3.读取Excel模版文件,加载到WritableWorkbook中,使其允许修改操作
- rwork = Workbook.getWorkbook(new File(realPath)) ; //读取模版文件
- wwb = Workbook.createWorkbook(new FileOutputStream(outPath),rwork) ; //修改模版
-
- //4.读取工作表
- WritableSheet sheet = wwb.getSheet(0) ;
- //查找工作表,如果没有获得相应工作表,先创建一个名为test的工作表
- if(sheet == null) {
- sheet = wwb.createSheet("test", 0) ;
- }
- if(map != null) {
- //5.先替换模版中的Parameter值 开始 ---------------------------------------------
- for(String value:indexMap.keySet()) {
- int x = Integer.parseInt(indexMap.get(value).split("#")[0]) ;
- int y = Integer.parseInt(indexMap.get(value).split("#")[1]) ;
- WritableCellFormat wc1 = new WritableCellFormat();
- wc1.setAlignment(Alignment.CENTRE); // 设置居中
- wc1.setFont(new WritableFont(WritableFont.createFont("宋体"), 12)) ;
- wc1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//上下居中
- Label label01 = null ;
- label01 = new Label(y,x,map.get(value),wc1) ;
- sheet.addCell(label01) ;
- }
- //5.先替换模版中的Parameter值 结束 ---------------------------------------------
- }
- /*
- * 6.通过list循环插入列值 开始---------------------------------------------
- * 通过反射来得到List对象的属性和值
- * */
- if(list != null) {
- for(int listSi = 0 ; listSi < list.size() - 2 ; listSi += 3 ) {
- List<Object> listValue = ReflectUtil.getAllFieldAndValue((List<Object>)list.get(listSi)) ;
- List<Object[]> dataValueList = (List<Object[]>) listValue.get(2) ;
- for(int i = 0 ; i < dataValueList.size() ; i ++ ) {
- WritableCellFormat wc2 = new WritableCellFormat();
- wc2.setAlignment(Alignment.CENTRE); // 设置居中
- wc2.setFont(new WritableFont(WritableFont.createFont("宋体"), 12)) ;
- wc2.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框线
- int iii = Integer.parseInt(list.get(listSi + 2 ).toString()) ;
- int www = Integer.parseInt(list.get(listSi + 1 ).toString()) ;
- sheet.insertRow(iii) ; //在指定位置插入一新行,用以插入数据
- Label label02 = null ;
- Object[] object = dataValueList.get(i) ;
- for(int num = 0 ; num < object.length ; num ++ ) {
- String value = "" ;
- if(object[num] != null ) {
- value = object[num].toString() ;
- }
- label02 = new Label(www + num , iii, value ,wc2) ;
- sheet.addCell(label02) ;
- }
- www += 1 ;
- }
- }
- }
- //6.通过list循环插入列值 结束---------------------------------------------
-
- //7.对指定单元格进行合并 开始-----------------------------------------
- if(merge) {
- JXLExcelModel jxlModel = null ;
- for(int jj = 0 ; jj < jxlList.size() ; jj ++ ) {
- WritableCellFormat wc3 = new WritableCellFormat();
- wc3.setAlignment(Alignment.CENTRE); // 设置居中
- wc3.setFont(new WritableFont(WritableFont.createFont("宋体"), 12)) ;
- wc3.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框线
- wc3.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//上下居中
- wc3.setWrap(true) ; //设置单元格属性为自动换行
- jxlModel = jxlList.get(jj) ;
- sheet.mergeCells(jxlModel.getStartX(), jxlModel.getStartY(), jxlModel.getEndX(), jxlModel.getEndY());
- /*
- * 如果有单元格进行合并,判断是否有需要填充的值
- * */
- if(jxlModel.getMergeText() != null) {
- sheet.addCell(new Label(jxlModel.getStartX(),jxlModel.getStartY(),jxlModel.getMergeText(),wc3)) ;
- }
- }
- }
- //7.对指定样式进行合并 结束-----------------------------------------
- //response.wait(wwb) ;
- try {
- //8.将编辑好的Excel存放到输出到指定的目录下
- wwb.write() ;
- } catch(java.lang.ArrayIndexOutOfBoundsException e) {
- System.out.println("线程异常") ;
- }
- } else {
- System.out.println("模版文件不存在 !!!") ;
- }
- } catch(Exception e) {
- System.out.println(e) ;
- } finally {
- //9.关闭wwb,以释放内存
- if(rwork != null) {
- rwork.close() ;
- }
- if(wwb != null) {
- try {
- wwb.close() ;
- } catch (WriteException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- String outPath = realPath.substring(0, realPath.length() - 4) + "_bak.xls" ;
- HSSFWorkbook rwb2 = null ;
- //8.对指定列进行上下行合并 开始----------------------------------------------------------
- if(mergeInt != null && list.size() > 0) {
- try {
- rwb2 = new HSSFWorkbook(new FileInputStream(outPath));
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。