2人参与 • 2025-03-10 • Java
<dependency> <groupid>cn.afterturn</groupid> <artifactid>easypoi-base</artifactid> <version>3.2.0</version> </dependency> <dependency> <groupid>cn.afterturn</groupid> <artifactid>easypoi-annotation</artifactid> <version>3.2.0</version> </dependency>
public class demo { @test void product() throws ioexception, parseexception { // 这里时间是用来做动态列的 string starttime = "2019-09-01 00:00:00"; string endtime = "2020-03-31 23:59:59"; // sheetname 列表 list<string> sheetnamelist = new arraylist<>(); sheetnamelist.add("sheet1"); sheetnamelist.add("sheet2"); sheetnamelist.add("sheet3"); // 将sheet1和sheet2使用得map进行包装 list<map<string, object>> sheetslist = new arraylist<>(); for (string sheetname : sheetnamelist) { // 获取每一个sheet列(里面有固定列,也有根据时间动态算出的列) list<excelexportentity> excelexportentities = getexportexceldefine(starttime, endtime); // 获取行数据(一般数据库拿) list<customermonthproductnum> rowsbean = new arraylist<>(); getoridate(rowsbean); // 组装一个sheet出来(sheet名称,列名,数据) map<string, object> onesheet = this.getonesheet(sheetname, excelexportentities, rowsbean); // 加入到sheet列表里面 sheetslist.add(onesheet); } // 导出多个sheet workbook workbook = exportexcel(sheetslist); fileoutputstream fos = new fileoutputstream("d:/多sheet动态列.xls"); workbook.write(fos); fos.close(); } /** * 获取原始数据(真实情况可能从数据库里面拿) * * @param rowsbean */ void getoridate(list<customermonthproductnum> rowsbean) { customermonthproductnum productnumbean = new customermonthproductnum(); productnumbean.setcustomername("张三"); productnumbean.setauthcode("121-121"); productnumbean.setregion("q"); productnumbean.setcustomerid(212312); productnumbean.setsum(2323); treemap<string, integer> productnum = new treemap<>(); productnum.put("2020-01", 1); productnum.put("2020-02", 12); productnum.put("2019-09", 19); productnumbean.setproductnum(productnum); rowsbean.add(productnumbean); rowsbean.add(productnumbean); customermonthproductnum productnumbean1 = new customermonthproductnum(); productnumbean1.setcustomername("张三"); productnumbean1.setauthcode("121-121"); productnumbean1.setregion("q"); productnumbean1.setcustomerid(212312); productnumbean1.setsum(2323); treemap<string, integer> productnum1 = new treemap<>(); productnum1.put("2020-01", 1); productnum1.put("2020-02", 12); productnum1.put("2019-09", 19); productnumbean1.setproductnum(productnum); rowsbean.add(productnumbean1); rowsbean.add(productnumbean1); } /** * 导出ecel * * @return org.apache.poi.ss.usermodel.workbook */ private static workbook exportexcel(list<map<string, object>> list) { workbook workbook = new hssfworkbook(); for (map<string, object> map : list) { myexcelexportservice service = new myexcelexportservice(); service.createsheetwithlist(workbook, (exportparams) map.get("title"), exportparams.class, (list<excelexportentity>) map.get("entitylist"), (collection<?>) map.get("data")); } return workbook; } private map<string, object> getonesheet(string sheetname, list<excelexportentity> collist, list<customermonthproductnum> datalist) { // 创建sheet1使用得map map<string, object> sheetexportmap = new hashmap<>(); // sheet1样式 exportparams sheet1exportparams = new exportparams(); // 设置sheet得名称 sheet1exportparams.setsheetname(sheetname); // title的参数为exportparams类型,目前仅仅在exportparams中设置了sheetname sheetexportmap.put("title", sheet1exportparams); //sheet1样式 sheetexportmap.put("entitylist", collist); //sheet1中要填充得数据 list<map<string, string>> rows = new arraylist<>(); for (customermonthproductnum data : datalist) { rows.add(this.getrowdata(data)); } sheetexportmap.put("data", rows); return sheetexportmap; } /** * 获取列定义 * * @param start 开始时间 * @param end 结束时间 */ private list<excelexportentity> getexportexceldefine(string start, string end) throws parseexception { // string start = "2019-09-01 00:00:00"; // string end = "2020-03-14 00:00:12"; list<string> monthbetweendates = dateutil.getmonthbetweendates(start, end); //定义表格列名,该集合存放的就是表格的列明,每个对象就是表格中的一列 list<excelexportentity> modellist = new arraylist<>(); //该对象就是定义列属性的对象 excelexportentity excelentity; //定义第一个列 excelentity = new excelexportentity("授权名", "agentname"); excelentity.setwidth(20); excelentity.setheight(10); modellist.add(excelentity); //定义第一个列 excelentity = new excelexportentity("大区", "region"); excelentity.setwidth(20); excelentity.setheight(10); modellist.add(excelentity); //定义第一个列 excelentity = new excelexportentity("授权码", "auth"); excelentity.setwidth(20); excelentity.setheight(10); modellist.add(excelentity); for (string monthbetweendate : monthbetweendates) { //定义第一个列 excelentity = new excelexportentity(monthbetweendate, monthbetweendate); excelentity.setwidth(10); excelentity.setheight(10); modellist.add(excelentity); } //定义列 excelentity = new excelexportentity("合计", "sum"); excelentity.setwidth(20); excelentity.setheight(10); modellist.add(excelentity); return modellist; } /** * 将对象数据转换为导出需要的map数据结构 * <pre> * map的可以对应了列定义里面的key。eg: excelexportentity("授权名", "agentname"); * </pre> * * @param productnum bean */ private map<string, string> getrowdata(customermonthproductnum productnum) { map<string, string> data = new hashmap<>(); data.put("agentname", productnum.getcustomername()); data.put("auth", productnum.getauthcode()); data.put("region", productnum.getregion()); data.put("sum", productnum.getsum().tostring()); treemap<string, integer> productnum1 = productnum.getproductnum(); for (map.entry<string, integer> stringintegerentry : productnum1.entryset()) { data.put(stringintegerentry.getkey(), stringintegerentry.getvalue().tostring()); } return data; } }
import cn.afterturn.easypoi.excel.annotation.exceltarget; import cn.afterturn.easypoi.excel.entity.exportparams; import cn.afterturn.easypoi.excel.entity.enmus.exceltype; import cn.afterturn.easypoi.excel.entity.params.excelexportentity; import cn.afterturn.easypoi.excel.export.excelexportservice; import cn.afterturn.easypoi.exception.excel.excelexportexception; import cn.afterturn.easypoi.exception.excel.enums.excelexportenum; import cn.afterturn.easypoi.util.poipublicutil; import lombok.extern.slf4j.slf4j; import org.apache.poi.ss.usermodel.workbook; import java.lang.reflect.field; import java.util.arraylist; import java.util.collection; import java.util.list; /** * 自定义下导出逻辑 * @author huan * @version 2.8.2 * @date 2019/7/5 */ @slf4j public class myexcelexportservice extends excelexportservice { public void createsheetwithlist(workbook workbook, exportparams entity, class<?> pojoclass, list<excelexportentity> entitylist, collection<?> dataset) { if (logger.isdebugenabled()) { logger.debug("excel export start ,class is {}", pojoclass); logger.debug("excel version is {}", entity.gettype().equals(exceltype.hssf) ? "03" : "07"); } if (workbook == null || entity == null || pojoclass == null || dataset == null) { throw new excelexportexception(excelexportenum.parameter_error); } try { list<excelexportentity> excelparams = entitylist; // 得到所有字段 field[] fileds = poipublicutil.getclassfields(pojoclass); exceltarget etarget = pojoclass.getannotation(exceltarget.class); string targetid = etarget == null ? null : etarget.value(); getallexcelfield(entity.getexclusions(), targetid, fileds, excelparams, pojoclass, null, null); //获取所有参数后,后面的逻辑判断就一致了 createsheetformap(workbook, entity, excelparams, dataset); } catch (exception e) { logger.error(e.getmessage(), e); throw new excelexportexception(excelexportenum.export_error, e.getcause()); } } }
public class dateutil { /** * 获取某个时间段内所有月份 * * @param mindate * @param maxdate * @return */ public static list<string> getmonthbetweendates(string mindate, string maxdate) throws parseexception { date d1 = new simpledateformat("yyyy-mm-dd hh:mm:ss").parse(mindate);//定义起始日期 date d2 = new simpledateformat("yyyy-mm-dd hh:mm:ss").parse(maxdate);//定义结束日期 可以去当前月也可以手动写日期。 arraylist<string> result = new arraylist<string>(); simpledateformat sdf = new simpledateformat("yyyy-mm");//格式化为年月 calendar min = calendar.getinstance(); calendar max = calendar.getinstance(); min.settime(d1); // min.set(min.get(calendar.year), min.get(calendar.month), 1); max.settime(d2); // max.set(max.get(calendar.year), max.get(calendar.month), 2); calendar curr = min; while (curr.before(max)) { result.add(sdf.format(curr.gettime())); curr.add(calendar.month, 1); } return result; } }
结果:
以上就是使用easypoi实现多sheet动态列导出的详细内容,更多关于easypoi多sheet导出的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论