当前位置:   article > 正文

Java生成操作excel(超详细,例如xml文件生成excel)_java如何将xml序列化为workbook

java如何将xml序列化为workbook
  1. import java.io.BufferedInputStream;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;
  9. import java.lang.reflect.Field;
  10. import java.util.HashMap;
  11. import java.util.List;
  12. import java.util.Map;
  13. import javax.servlet.http.HttpServletResponse;
  14. import org.apache.poi.hssf.usermodel.HSSFCell;
  15. import org.apache.poi.hssf.usermodel.HSSFRow;
  16. import org.apache.poi.hssf.usermodel.HSSFSheet;
  17. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  18. import jxl.Workbook;
  19. import jxl.format.Alignment;
  20. import jxl.format.Border;
  21. import jxl.format.BorderLineStyle;
  22. import jxl.read.biff.BiffException;
  23. import jxl.write.Label;
  24. import jxl.write.WritableCellFormat;
  25. import jxl.write.WritableFont;
  26. import jxl.write.WritableImage;
  27. import jxl.write.WritableSheet;
  28. import jxl.write.WritableWorkbook;
  29. import jxl.write.WriteException;
  30. public class ExcelUtil {
  31. private static WritableSheet sheet = null;
  32. private static WritableSheet sheetToMap = null;
  33. private static WritableSheet sheetToMerge = null;
  34. private static Workbook rwork = null ;
  35. private static WritableWorkbook wwb = null ;
  36. private static Map<String,String> indexMap = null ;
  37. /**
  38. * @param 用来代替传统的使用IReport生成Excel
  39. * @param jxl操作excel1
  40. * @param 只替换Paremeter的值
  41. * @param 2012-03-23
  42. * @param List的值和顺序完全按照Bean的属性和值来排列的,如果需要修改排列顺序,那么请修改Bean属性的排列顺序
  43. * @param String realPath :读取模版路径
  44. * @param String outPath :输出模版路径
  45. * @param Map<String,String> map :需要替换的Parameter
  46. * @return
  47. * */
  48. public static void jExcelTemplate(String realPath,Map<String,String> map,HttpServletResponse response) {
  49. try {
  50. jxlDocTemplateAll(realPath,map,null,0,0,null,null,response) ;
  51. } catch (WriteException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. /**
  56. * @param 用来代替传统的使用IReport生成Excel
  57. * @param jxl操作excel1
  58. * @param 只替换List的值
  59. * @param List的值和顺序完全按照Bean的属性和值来排列的,如果需要修改排列顺序,那么请修改Bean属性的排列顺序
  60. * @param 需要设置坐标,即List循环的起始坐标
  61. * @param 2012-03-23
  62. * @param String realPath :读取模版路径
  63. * @param String outPath :输出模版路径
  64. * @param List<?> list :循环任意类型的List
  65. * @param list可以没有指定的泛型,但必须是指定的Model
  66. * @param list必须要指定初始化的坐标
  67. * @return
  68. * */
  69. public static void jExcelTemplate(String realPath,List<?> list,int x,int y,HttpServletResponse response) {
  70. try {
  71. jxlDocTemplateAll(realPath,null,list,x,y,null,null,response) ;
  72. } catch (WriteException e) {
  73. e.printStackTrace();
  74. }
  75. }
  76. /**
  77. * @param 用来代替传统的使用IReport生成Excel
  78. * @param jxl操作excel1
  79. * @param 2012-03-23
  80. * @param 替换Paremeter和List的值
  81. * @param Paremeter即传如的Map<String,String>,且必须的String类型的
  82. * @param Paremeter必须且最少有一个和模版上的值对应上,否则会报错
  83. * @param List的值和顺序完全按照Bean的属性和值来排列的,如果需要修改排列顺序,那么请修改Bean属性的排列顺序
  84. * @param 需要设置坐标,即List循环的起始坐标
  85. * @param String realPath :读取模版路径
  86. * @param String outPath :输出模版路径
  87. * @param Map<String,String> map :需要替换的Parameter
  88. * @param List<?> list :循环任意类型的List
  89. * @param list可以没有指定的泛型,但必须是指定的Model
  90. * @param list必须要指定初始化的坐标
  91. * @return
  92. * */
  93. public static void jExcelTemplate(String realPath,Map<String,String> map,List<?> list,int x,int y,HttpServletResponse response) {
  94. try {
  95. jxlDocTemplateAll(realPath,map,list,x,y,null,null,response) ;
  96. } catch (WriteException e) {
  97. e.printStackTrace();
  98. }
  99. }
  100. /**
  101. * @param 用来代替传统的使用IReport生成Excel
  102. * @param jxl操作excel1
  103. * @param 2012-03-23
  104. * @param 替换Paremeter和List的值,指定合并的单元格
  105. * @param Paremeter即传如的Map<String,String>,且必须的String类型的
  106. * @param Paremeter必须且最少有一个和模版上的值对应上,否则会报错
  107. * @param List的值和顺序完全按照Bean的属性和值来排列的,如果需要修改排列顺序,那么请修改Bean属性的排列顺序
  108. * @param 需要设置坐标,即List循环的起始坐标
  109. * @param String realPath :读取模版路径
  110. * @param String outPath :输出模版路径
  111. * @param Map<String,String> map :需要替换的Parameter
  112. * @param List<?> list :循环任意类型的List
  113. * @param list可以没有指定的泛型,但必须是指定的Model
  114. * @param list必须要指定初始化的坐标
  115. * @param 允许合并多个单元格,并且属性是居中,自动换行的
  116. * @param 合并的单元格如果想替换成指定内容,需要对传入的List<JXLExcelModel> 中 JXLExcelModel.mergeText赋值
  117. * @return
  118. * */
  119. public static void jExcelTemplate(String realPath,Map<String,String> map,List<?> list,int x,int y,List<JXLExcelModel> jxlList,HttpServletResponse response) {
  120. try {
  121. jxlDocTemplateAll(realPath,map,list,x,y,jxlList,null,response) ;
  122. } catch (WriteException e) {
  123. e.printStackTrace();
  124. }
  125. }
  126. /**
  127. * @param 用来代替传统的使用IReport生成Excel
  128. * @param jxl操作excel1
  129. * @param 2012-03-23
  130. * @param 替换Paremeter和List的值,指定合并的单元格
  131. * @param Paremeter即传如的Map<String,String>,且必须的String类型的
  132. * @param Paremeter必须且最少有一个和模版上的值对应上,否则会报错
  133. * @param List的值和顺序完全按照Bean的属性和值来排列的,如果需要修改排列顺序,那么请修改Bean属性的排列顺序
  134. * @param 需要设置坐标,即List循环的起始坐标
  135. * @param String realPath :读取模版路径
  136. * @param String outPath :输出模版路径
  137. * @param Map<String,String> map :需要替换的Parameter
  138. * @param List<?> list :循环任意类型的List
  139. * @param list可以没有指定的泛型,但必须是指定的Model
  140. * @param list必须要指定初始化的坐标
  141. * @param 允许合并多个单元格,并且属性是居中,自动换行的
  142. * @param 合并的单元格如果想替换成指定内容,需要对传入的List<JXLExcelModel> 中 JXLExcelModel.mergeText赋值
  143. * @return
  144. * */
  145. public static void jExcelTemplate(String realPath,Map<String,String> map,List<?> list,int x,int y,List<JXLExcelModel> jxlList,int[][] mergeInt,HttpServletResponse response) {
  146. try {
  147. jxlDocTemplateAll(realPath,map,list,x,y,jxlList,mergeInt,response) ;
  148. } catch (WriteException e) {
  149. e.printStackTrace();
  150. }
  151. }
  152. /**
  153. * @param 用来代替传统的使用IReport生成Excel
  154. * @param jxl操作excel1
  155. * @param 操作List,Map,合并单元格,合并单元格填充的值
  156. * @param List的值和顺序完全按照Bean的属性和值来排列的,如果需要修改排列顺序,那么请修改Bean属性的排列顺序
  157. * @param String realPath :读取模版路径
  158. * @param String outPath :输出模版路径
  159. * @param Map<String,String> map :需要替换的Parameter
  160. * @param List<?> list :循环任意类型的List
  161. * @param list可以没有指定的泛型,但必须是指定的Model
  162. * @param list必须要指定初始化的坐标
  163. * @param 允许合并多个单元格,并且属性是居中,自动换行的
  164. * @param 合并的单元格如果想替换成指定内容,需要对传入的List<JXLExcelModel> 中 JXLExcelModel.mergeText赋值
  165. * @return
  166. * */
  167. public static void jExcelTemplate(String realPath,Map<String,String> map,List<?> list,List<JXLExcelModel> jxlList,HttpServletResponse response) {
  168. try {
  169. jxlDocTemplateAllMoreList(realPath,map,list,jxlList,null,response) ;
  170. } catch (WriteException e) {
  171. e.printStackTrace();
  172. }
  173. }
  174. /**
  175. * @param 用来代替传统的使用IReport生成Excel
  176. * @param jxl操作excel1
  177. * @param 操作List,Map,合并单元格,合并单元格填充的值
  178. * @param List的值和顺序完全按照Bean的属性和值来排列的,如果需要修改排列顺序,那么请修改Bean属性的排列顺序
  179. * @param String realPath :读取模版路径
  180. * @param String outPath :输出模版路径
  181. * @param Map<String,String> map :需要替换的Parameter
  182. * @param List<?> list :循环任意类型的List
  183. * @param list可以没有指定的泛型,但必须是指定的Model
  184. * @param list必须要指定初始化的坐标
  185. * @param 允许合并多个单元格,并且属性是居中,自动换行的
  186. * @param 合并的单元格如果想替换成指定内容,需要对传入的List<JXLExcelModel> 中 JXLExcelModel.mergeText赋值
  187. * @param int[][] mergeInt :对指定列的上下行进行合并
  188. * @return
  189. * */
  190. public static void jExcelTemplate(String realPath,Map<String,String> map,List<?> list,List<JXLExcelModel> jxlList,int[] [] mergeInt,HttpServletResponse response) {
  191. try {
  192. jxlDocTemplateAllMoreList(realPath,map,list,jxlList,mergeInt,response) ;
  193. } catch (WriteException e) {
  194. e.printStackTrace();
  195. }
  196. }
  197. /*
  198. * 2012-03-23
  199. * 这个方法能遍历多个List表格
  200. * */
  201. @SuppressWarnings("unchecked")
  202. public static void jxlDocTemplateAllMoreList(String realPath,Map<String,String> map,List<?> list,List<JXLExcelModel> jxlList,int[][] mergeInt,HttpServletResponse response) throws WriteException {
  203. try {
  204. String outPath = realPath.substring(0, realPath.length() - 4) + "_bak.xls" ;
  205. boolean merge = false ; //判断是否有单元格要进行合并
  206. if(jxlList != null) {
  207. merge = true ;
  208. }
  209. if(fileExist(realPath)) {
  210. //1.找到模版文件并加载
  211. HSSFWorkbook rwb = new HSSFWorkbook(new FileInputStream(realPath)) ;
  212. //2.得到要修改的Parameter,并记录坐标 开始-------------------------
  213. HSSFSheet sht = rwb.getSheetAt(0) ;
  214. Map<String,String> indexMap = new HashMap<String,String>() ;
  215. /*
  216. * 判断是否有需要替换的Paremeter
  217. * 通过map来遍历得到要替换对象在excel中的坐标并保存在(indexMap)坐标map中
  218. * 格式 x|y
  219. * */
  220. if(map != null) {
  221. String indexList = "" ;
  222. for(String value:map.keySet()) {//遍历是否存在要替换的Parameter坐标,并记录在Map中 格式: x|y
  223. try {
  224. indexList = getCellindex(sht, value) ;
  225. //cell = getCellindex(sht, value);
  226. } catch(java.lang.RuntimeException e) {
  227. continue ;
  228. }
  229. indexMap.put(value, indexList) ;
  230. }
  231. }
  232. //2.得到要修改的Parameter,并记录坐标 结束-------------------------
  233. //3.读取Excel模版文件,加载到WritableWorkbook中,使其允许修改操作
  234. rwork = Workbook.getWorkbook(new File(realPath)) ; //读取模版文件
  235. wwb = Workbook.createWorkbook(new FileOutputStream(outPath),rwork) ; //修改模版
  236. //4.读取工作表
  237. WritableSheet sheet = wwb.getSheet(0) ;
  238. //查找工作表,如果没有获得相应工作表,先创建一个名为test的工作表
  239. if(sheet == null) {
  240. sheet = wwb.createSheet("test", 0) ;
  241. }
  242. if(map != null) {
  243. //5.先替换模版中的Parameter值 开始 ---------------------------------------------
  244. for(String value:indexMap.keySet()) {
  245. int x = Integer.parseInt(indexMap.get(value).split("#")[0]) ;
  246. int y = Integer.parseInt(indexMap.get(value).split("#")[1]) ;
  247. WritableCellFormat wc1 = new WritableCellFormat();
  248. wc1.setAlignment(Alignment.CENTRE); // 设置居中
  249. wc1.setFont(new WritableFont(WritableFont.createFont("宋体"), 12)) ;
  250. wc1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//上下居中
  251. Label label01 = null ;
  252. label01 = new Label(y,x,map.get(value),wc1) ;
  253. sheet.addCell(label01) ;
  254. }
  255. //5.先替换模版中的Parameter值 结束 ---------------------------------------------
  256. }
  257. /*
  258. * 6.通过list循环插入列值 开始---------------------------------------------
  259. * 通过反射来得到List对象的属性和值
  260. * */
  261. if(list != null) {
  262. for(int listSi = 0 ; listSi < list.size() - 2 ; listSi += 3 ) {
  263. List<Object> listValue = ReflectUtil.getAllFieldAndValue((List<Object>)list.get(listSi)) ;
  264. List<Object[]> dataValueList = (List<Object[]>) listValue.get(2) ;
  265. for(int i = 0 ; i < dataValueList.size() ; i ++ ) {
  266. WritableCellFormat wc2 = new WritableCellFormat();
  267. wc2.setAlignment(Alignment.CENTRE); // 设置居中
  268. wc2.setFont(new WritableFont(WritableFont.createFont("宋体"), 12)) ;
  269. wc2.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框线
  270. int iii = Integer.parseInt(list.get(listSi + 2 ).toString()) ;
  271. int www = Integer.parseInt(list.get(listSi + 1 ).toString()) ;
  272. sheet.insertRow(iii) ; //在指定位置插入一新行,用以插入数据
  273. Label label02 = null ;
  274. Object[] object = dataValueList.get(i) ;
  275. for(int num = 0 ; num < object.length ; num ++ ) {
  276. String value = "" ;
  277. if(object[num] != null ) {
  278. value = object[num].toString() ;
  279. }
  280. label02 = new Label(www + num , iii, value ,wc2) ;
  281. sheet.addCell(label02) ;
  282. }
  283. www += 1 ;
  284. }
  285. }
  286. }
  287. //6.通过list循环插入列值 结束---------------------------------------------
  288. //7.对指定单元格进行合并 开始-----------------------------------------
  289. if(merge) {
  290. JXLExcelModel jxlModel = null ;
  291. for(int jj = 0 ; jj < jxlList.size() ; jj ++ ) {
  292. WritableCellFormat wc3 = new WritableCellFormat();
  293. wc3.setAlignment(Alignment.CENTRE); // 设置居中
  294. wc3.setFont(new WritableFont(WritableFont.createFont("宋体"), 12)) ;
  295. wc3.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框线
  296. wc3.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//上下居中
  297. wc3.setWrap(true) ; //设置单元格属性为自动换行
  298. jxlModel = jxlList.get(jj) ;
  299. sheet.mergeCells(jxlModel.getStartX(), jxlModel.getStartY(), jxlModel.getEndX(), jxlModel.getEndY());
  300. /*
  301. * 如果有单元格进行合并,判断是否有需要填充的值
  302. * */
  303. if(jxlModel.getMergeText() != null) {
  304. sheet.addCell(new Label(jxlModel.getStartX(),jxlModel.getStartY(),jxlModel.getMergeText(),wc3)) ;
  305. }
  306. }
  307. }
  308. //7.对指定样式进行合并 结束-----------------------------------------
  309. //response.wait(wwb) ;
  310. try {
  311. //8.将编辑好的Excel存放到输出到指定的目录下
  312. wwb.write() ;
  313. } catch(java.lang.ArrayIndexOutOfBoundsException e) {
  314. System.out.println("线程异常") ;
  315. }
  316. } else {
  317. System.out.println("模版文件不存在 !!!") ;
  318. }
  319. } catch(Exception e) {
  320. System.out.println(e) ;
  321. } finally {
  322. //9.关闭wwb,以释放内存
  323. if(rwork != null) {
  324. rwork.close() ;
  325. }
  326. if(wwb != null) {
  327. try {
  328. wwb.close() ;
  329. } catch (WriteException e) {
  330. e.printStackTrace();
  331. } catch (IOException e) {
  332. e.printStackTrace();
  333. }
  334. }
  335. String outPath = realPath.substring(0, realPath.length() - 4) + "_bak.xls" ;
  336. HSSFWorkbook rwb2 = null ;
  337. //8.对指定列进行上下行合并 开始----------------------------------------------------------
  338. if(mergeInt != null && list.size() > 0) {
  339. try {
  340. rwb2 = new HSSFWorkbook(new FileInputStream(outPath));
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/767849
推荐阅读
相关标签
  

闽ICP备14008679号