POI 生成 word 文档 简单版(包括文字、表格、图片、字体样式设置等)
POI 生成word 文档 一般有两种方法:
① word模板 生成word 文档 ;
② 写代码直接生成 word 文档;
我这里演示的是第二种方法,即写代码生成 word文档,不多说废话,直接代码;
/** * 镇街日报导出word */ @RequestMapping (params = "exportWordForTownDaily" ) public void exportWordForTownDaily(HttpServletResponse response ,String selectDate){ if (StringUtils.isNullOrEmpty(selectDate)){ return ; } SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" ); try { sdf.parse(selectDate); } catch (Exception e){ e.printStackTrace(); return ; } CaseEntity entity = new CaseEntity(); entity.setRepotingTime_begin(selectDate + " 00:00:00" ); entity.setRepotingTime_end(selectDate + " 23:59:59" ); //获取镇街实际扣分 List<CaseEntity> caseEntityList = statisticsService.getTownActualScore(entity); //获取各镇街情况 List<Map<String, Object>> townDaily = statisticsService.townDaily(entity); //格式化查询日期(年月日) SimpleDateFormat sdf2 = new SimpleDateFormat( "yyyy年MM月dd日" ); try { selectDate = sdf2.format(sdf.parse(selectDate)); } catch (ParseException e) { e.printStackTrace(); } //------------------------------------生成word文档------------------------------------------------ //创建document对象 XWPFDocumentUtil document = new XWPFDocumentUtil(); //创建标题段落 XWPFParagraph titleParag = document.createParagraph(); XWPFRun titleRun = titleParag.createRun(); titleRun.setText( "镇街日报" ); titleRun.setFontSize( 20 ); titleRun.setBold( true ); //字体是否加粗 titleParag.setAlignment(ParagraphAlignment.LEFT); //段落居左 //换行 //XWPFParagraph brParagraph1 = document.createParagraph(); //XWPFRun brRun = brParagraph1.createRun(); //brRun.setText("\n"); //创建一个段落 XWPFParagraph p = document.createParagraph(); int rows = caseEntityList.size()+ 1 ; int cols = 3 ; //创建一个表格 XWPFTable table= document.createTable(rows, cols); //表格属性 CTTblPr tablePr = table.getCTTbl().addNewTblPr(); //表格宽度 CTTblWidth width = tablePr.addNewTblW(); width.setW(BigInteger.valueOf( 5000 )); //设置表格宽度为非自动 width.setType(STTblWidth.DXA); //表头行 XWPFTableRow headRow = table.getRow( 0 ); XWPFTableCell headCell0 = headRow.getCell( 0 ); XWPFTableCell headCell1 = headRow.getCell( 1 ); XWPFTableCell headCell2 = headRow.getCell( 2 ); p = headCell0.addParagraph(); XWPFRun headRun0 = p.createRun(); headRun0.setText( "序号" ); headRun0.setFontSize( 12 ); headRun0.setBold( true ); //是否粗体 headCell0.setColor( "DEDEDE" ); //垂直居中 p.setVerticalAlignment(TextAlignment.CENTER); //水平居中 p.setAlignment(ParagraphAlignment.CENTER); p = headCell1.addParagraph(); XWPFRun headRun1 = p.createRun(); headRun1.setText( "镇街" ); headRun1.setFontSize( 12 ); headRun1.setBold( true ); headCell1.setColor( "DEDEDE" ); //垂直居中 p.setVerticalAlignment(TextAlignment.CENTER); //水平居中 p.setAlignment(ParagraphAlignment.CENTER); p = headCell2.addParagraph(); XWPFRun headRun2 = p.createRun(); headRun2.setFontSize( 12 ); headRun2.setText( "总扣分" ); headRun2.setBold( true ); headCell2.setColor( "DEDEDE" ); //垂直居中 p.setVerticalAlignment(TextAlignment.CENTER); //水平居中 p.setAlignment(ParagraphAlignment.CENTER); //表主体行 for ( int i= 0 ;i<caseEntityList.size();i++){ CaseEntity caseEntity = caseEntityList.get(i); XWPFTableRow contentRow = table.getRow(i+ 1 ); XWPFTableCell cell0 = contentRow.getCell( 0 ); XWPFTableCell cell1 = contentRow.getCell( 1 ); XWPFTableCell cell2 = contentRow.getCell( 2 ); p = cell0.addParagraph(); XWPFRun pRun0=p.createRun(); pRun0.setText(i+ 1 + "" ); //垂直居中 cell0.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); //水平居中 p.setAlignment(ParagraphAlignment.CENTER); p = cell1.addParagraph(); XWPFRun pRun1=p.createRun(); pRun1.setText(caseEntity.getTownName()); //垂直居中 cell1.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); //水平居中 p.setAlignment(ParagraphAlignment.CENTER); p = cell2.addParagraph(); XWPFRun pRun2=p.createRun(); pRun2.setText(caseEntity.getTownActualScore().toString()); //垂直居中 cell2.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); //水平居中 p.setAlignment(ParagraphAlignment.CENTER); } //-----------------------------各镇街情况------------------------------ //创建标题段落 XWPFParagraph title1 = document.createParagraph(); XWPFRun title1Run = title1.createRun(); title1Run.setText( "\r各镇街比较严重的问题" ); title1Run.setFontSize( 20 ); title1Run.setBold( true ); try { for (Map<String,Object> townMap:townDaily){ CaseEntity townCase = (CaseEntity)townMap.get( "townCase" ); XWPFParagraph xwpfParagraph = document.createParagraph(); XWPFRun xwpfRun_town = xwpfParagraph.createRun(); XWPFRun xwpfRun = xwpfParagraph.createRun(); xwpfRun_town.setText(townCase.getTownName()); xwpfRun_town.setFontSize( 14 ); xwpfRun_town.setBold( true ); xwpfRun_town.setColor( "00cc44" ); xwpfRun.setText( "," +selectDate+ "当天扣分较多的问题有:" ); xwpfRun.setFontSize( 14 ); xwpfRun.setBold( true ); List<Map<String,Object>> caseInfoList = (List<Map<String,Object>>)townMap.get( "caseInfoList" ); Integer no = 0 ; for (Map<String,Object> map:caseInfoList){ CaseEntity caseInfo = (CaseEntity)map.get( "caseInfo" ); XWPFParagraph xwpfParagraph1 = document.createParagraph(); XWPFRun xwpfRun1 =xwpfParagraph1.createRun(); XWPFRun xwpfRun2 = xwpfParagraph1.createRun(); XWPFRun xwpfRun3 = xwpfParagraph1.createRun(); xwpfRun1.setText((++no)+ "、" ); xwpfRun2.setText(caseInfo.getProblemStreet()); xwpfRun3.setText( "," +caseInfo.getProblemNotes()); xwpfRun1.setFontSize( 14 ); xwpfRun2.setFontSize( 14 ); xwpfRun2.setColor( "4747d1" ); xwpfRun3.setFontSize( 14 ); List<AttachmentEntity> fileList = (List<AttachmentEntity>)map.get( "fileList" ); for (AttachmentEntity at:fileList){ String mainPath = at.getMainPath(); String path = at.getPath(); if (!StringUtils.isNullOrEmpty(mainPath) && !StringUtils.isNullOrEmpty(path)){ //第一张图片 document.addPictureData( new FileInputStream(mainPath+path), XWPFDocumentUtil.PICTURE_TYPE_JPEG); document.createPicture(document.getAllPictures().size() - 1 , 300 , 400 , document.createParagraph()); } } } } OutputStream output = response.getOutputStream(); //生成word文件的文件名 String fileName= new String(( "镇街日报.docx" ).getBytes( "UTF-8" ), "iso-8859-1" ); response.setHeader( "Content-disposition" , "attachment; filename=" + fileName); //把word文档写到输出流 document.write(output); } catch (InvalidFormatException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //--------------------------------word文档结束----------------------------------------------------- } |
效果如下图所示:
linhuaming
标签:
POI 操作office
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?