新的一年,又一个开始,不见收获,却见年龄,好一个猪年,待我先来一首里尔克的诗:
《沉重的时刻》(里尔克)
此刻有谁在世上某处哭,无缘无故在世上哭,在哭我。 此刻有谁在夜间某处笑,无缘无故在夜间笑,在笑我。 此刻有谁在世上某处走,无缘无故在世上走,走向我。 此刻有谁在世上某处死,无缘无故在世上死,望着我。
不考虑以上所说的问题,个人花了些许时间写了两个excel 工具类:excelreadutil以及excelwriteutil (代码地址见篇尾),集中处理了包含单不仅限于以下问题:
toxlsxbymap(list<map<string,object>> datalist, string[] headernames, string[] cellnames, cellfmt[] cellfmts)
导致的问题是传入的datalist内部的map的value必须是object类型,之后钻研了下java泛型,使用这种方式轻松解决问题!
public static <v extends object> file toxlsxbymap(list<map<string,v>> datalist, string[] headernames, string[] cellnames, cellfmt[] cellfmts)
//数据分组 list<list<map<string, v>>> mdata = splitmaplist(datalist); //循环每组数据 并创建sheet>写单元格 for (list<map<string, v>> sublist : mdata) { //第一个sheet 参数(sheet名称,sheet的序号) sheet = workbook.createsheet(string.format("%s~%s", (datalist.size() > data_split_grop_size ? mdata.indexof(sublist) * data_split_grop_size + 1 : 0) + "", (datalist.size() > data_split_grop_size ? (mdata.size() == (mdata.indexof(sublist) + 1) ? datalist.size() : data_split_grop_size * (mdata.indexof(sublist) + 1)) : datalist.size()) + "") ); logger.info(">>>sheet name : {}",sheet.getsheetname()); poicellprocess.writeheadercell(sheet,headercellstyle,headernames); poicellprocess.writebodycellbymap(sheet,bodycellstyle,cellnames,sublist, cellfmts); }
public static cellstyle headercellstyle(sxssfworkbook wb){ cellstyle headerstyle = wb.createcellstyle(); //...some code //允许单元格内换行 headerstyle.setwraptext(true); return headerstyle; }
单元格类型及格式处理问题
这个问题其实分为多个,而且密切相关,大致有这几个:
- 单元格样式类
- 单元格样式类
- 单元格数据类型
- 单元格写入数据格式
但是,处理了这几个问题其实还不够完美
至于不完美的原因是什么呢,一个是excel数据格式与java数据格式不一致(这个体现在日期,长数字,小数的处理上),比如你要格式化的日期后为“yyyy-mm-dd” 这种类型,
但是在excel中相近的格式类型只有这样“yyyy/m/d”,如果强制单元格样式类型为“yyyy-mm-dd hh24:mi:ss” 其实也是可以的,只不过会变成自定义格式,而且是excel的自定义格式,
具体如下图:
另外一个问题是单元格类型与编程语言的数据类型相异同时与poi所能提供的数据类型也相异,如图:
public static void writeheadercell(sxssfsheet sheet, cellstyle headercellstyle, string[] headernames) { sxssfrow row = sheet.createrow(0); row.setheight((short) 30); row.setheightinpoints((short) 30); sxssfcell headercell; for (int i = 0; i < headernames.length; i++) { headercell = row.createcell(i); headercell.setcellstyle(headercellstyle); headercell.setcellvalue(headernames[i]); sheet.setcolumnwidth(i, null == headernames[i] ? cell_base_length : (headernames[i].contains("\r\n") ? cell_charset_length * headernames[i].length() / 2 : cell_charset_length * headernames[i].length())); } }这是最终处理的结果:
以上写的过于粗糙,各位有更好的想法请分享下哈~
现在是 2019-02-18 星期一,各位中午好~
如对本文有疑问, 点击进行留言回复!!
SpringBoot引用阿里easyexcel,Excel导出返回浏览器下载
HashMap、Hashtable、ConcurrentHashMap三者间的异同
解决RecycleView 中Item包含Edittext时,滑动view复用导致数据错乱的问题
多线程、同步工作原理、死锁案例、Lock接口、线程的生命周期的讲解及实现
网友评论