编辑
上面是java 利用word模板生成的一个word报告文档,利用的是第三方类库Poi-tl 是实现的。
poi-tl是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库,你可以非常方便的加入到你的项目中,并且拥有着让人喜悦的特性。
poi-tl网址 Poi-tl Documentation,之前也用过其他几种生成word的方式,比如,直接用Apache POI去生成等,不过都比较麻烦一点,最后比较之后选择了用这个类库。下面给大家上代码教程。
一、pom文件中引入依赖(以为springboot项目为例)
<!-- 生成word工具包--> <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.7.3</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency>
注:Poi-tl包依赖poi包,版本对照关系如下图
编辑
二、代码实现
import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.policy.HackLoopTableRenderPolicy; import org.springblade.core.tool.utils.DateUtil; import java.io.FileOutputStream; import java.io.IOException; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; /** * @Description: * @Author: Tarzan Liu * @Date: 2022/9/13 4:54 */ public class WordUtil { public static void test(){ TestDTO data=new TestDTO(); data.setWorkFaceName("14030回采工作面"); data.setCreateDate(DateUtil.format(DateUtil.now(),"yyyy年MM月dd日")); TestDTO.Progress progress=new TestDTO.Progress(); progress.setWorkFaceName("14030回采工作面"); progress.setDate("2019年06月"); progress.setProgress(69.2); progress.setArea(13909.2); progress.setProduction(115436.985); progress.setCumulative(115436.985); List<TestDTO.Progress> list=new ArrayList<>(); list.add(progress); data.setList(list); double totalProgress = 0; double totalArea=0; double totalProduction=0; for (TestDTO.Progress e : list) { totalProgress=totalProgress+e.getProgress(); totalArea=totalArea+e.getArea(); totalProduction=totalProduction+e.getProduction(); } data.setTotalProgress(totalProgress); data.setTotalArea(totalArea); data.setTotalProduction(totalProduction); data.setDpp(5790.472); data.setDap(5860d); data.setDop(sub(data.getDap(),data.getDpp())); data.setMpp(179504.641); data.setMap(115436.985); data.setMop(sub(data.getMap(),data.getMpp())); data.setYpp(2119312.857); data.setYap(115436.985); data.setYop(sub(data.getYap(),data.getYpp())); data.setCpp(59.063); data.setCap(57.085); data.setCop(sub(data.getCap(),data.getCpp())); data.setDpf(3.46); data.setDaf(3.46); data.setDof(sub(data.getDaf(),data.getDpf())); data.setMpf(69.2); data.setMaf(107.26); data.setMof(sub(data.getMaf(),data.getMpf())); data.setYpf(69.2); data.setYaf(1266.36); data.setYof(sub(data.getYaf(),data.getYpf())); data.setCpf(352.92); data.setCaf(352.92); data.setCof(sub(data.getCaf(),data.getCpf())); if(data.getMop()>0){ data.setRp("本月超出产量指标:"+data.getMop()+" 吨"); }else{ data.setRp("本月剩余产量指标:"+Math.abs(data.getMop())+" 吨"); } if(data.getMof()>0){ data.setRf("本月超出进尺指标:"+data.getMof()+" 吨"); }else{ data.setRf("本月剩余进尺指标:"+Math.abs(data.getMof())+" 吨"); } data.setFaultAge("F186断层"); data.setDistance(514.809); HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy(); Configure config = Configure.newBuilder().bind("list", policy).build(); XWPFTemplate template = XWPFTemplate.compile("C:\\Users\\Lenovo\\Desktop\\word\\回采进度生产分析报告模板.docx",config).render(data);//调用模板,填充数据 try { FileOutputStream out = new FileOutputStream("C:\\Users\\Lenovo\\Desktop\\word\\test.docx");//要导出的文件名 template.write(out); out.flush(); out.close(); template.close(); } catch (IOException e) { e.printStackTrace(); } } private static double sub(double a,double b){ BigDecimal x=BigDecimal.valueOf(a); BigDecimal y=BigDecimal.valueOf(b); BigDecimal z=x.subtract(y); return z.doubleValue(); } public static void main(String[] args) { WordUtil.test(); } }
TestDTO对象
import lombok.Data; import java.util.List; @Data public class TestDTO { private String createDate; private String workFaceName; private List<Progress> list; private Double totalProgress; private Double totalArea; private Double totalProduction; private Double dpp; private Double dap; private Double dop; private Double mpp; private Double map; private Double mop; private Double ypp; private Double yap; private Double yop; private Double cpp; private Double cap; private Double cop; private Double dpf; private Double daf; private Double dof; private Double mpf; private Double maf; private Double mof; private Double ypf; private Double yaf; private Double yof; private Double cpf; private Double caf; private Double cof; private String rp; private String rf; private String faultAge; private Double distance; @Data static class Progress{ private String workFaceName; private String date; private Double progress; private Double area; private Double production; private Double cumulative; } }
可以把内部类,改成单独类。运行WordUtil的主方法即可,生成word文档,可以根据自己的需求改造成接口。
三、word模板示例
编辑