From 57fdc64842e295ad0bf356307fc37c199a1805c4 Mon Sep 17 00:00:00 2001 From: yang_shj <1069818635@QQ.com> Date: Wed, 10 Jan 2024 19:30:18 +0800 Subject: [PATCH 1/2] =?UTF-8?q?#=E6=96=BD=E5=B7=A5=E6=97=A5=E5=BF=97word?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hzims-service-api/hzims-operational-api/pom.xml | 6 + .../access/entity/OperConstructionEntity.java | 6 +- .../operational/access/vo/ConstructionVo.java | 20 ++ .../access/controller/ConstructionController.java | 2 +- .../service/impl/ConstructionServiceImpl.java | 155 ++++++++-- .../com/hnac/hzims/operational/util/PdfUtils.java | 320 +++++++++++++++++++++ .../com/hnac/hzims/operational/util/WordUtils.java | 15 +- .../src/main/resources/log/logback-dev.xml | 127 -------- .../src/main/resources/log/logback-prod.xml | 127 -------- .../src/main/resources/log/logback-test.xml | 127 -------- .../template/excel/constructio_template.xlsx | Bin 17960 -> 0 bytes .../template/word/constructio_template.docx | Bin 0 -> 18910 bytes 12 files changed, 481 insertions(+), 424 deletions(-) create mode 100644 hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/PdfUtils.java delete mode 100644 hzims-service/operational/src/main/resources/log/logback-dev.xml delete mode 100644 hzims-service/operational/src/main/resources/log/logback-prod.xml delete mode 100644 hzims-service/operational/src/main/resources/log/logback-test.xml delete mode 100644 hzims-service/operational/src/main/resources/template/excel/constructio_template.xlsx create mode 100644 hzims-service/operational/src/main/resources/template/word/constructio_template.docx diff --git a/hzims-service-api/hzims-operational-api/pom.xml b/hzims-service-api/hzims-operational-api/pom.xml index 4d40f42..4dc32e8 100644 --- a/hzims-service-api/hzims-operational-api/pom.xml +++ b/hzims-service-api/hzims-operational-api/pom.xml @@ -67,6 +67,12 @@ com.hnac.hzims middle-api + + cn.afterturn + easypoi-base + 4.4.0 + compile + diff --git a/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/entity/OperConstructionEntity.java b/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/entity/OperConstructionEntity.java index b164315..8c138e0 100644 --- a/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/entity/OperConstructionEntity.java +++ b/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/entity/OperConstructionEntity.java @@ -28,14 +28,14 @@ public class OperConstructionEntity extends TenantEntity { private String code; @ApiModelProperty(value = "检修名称") - private String constructionTime; - - @ApiModelProperty(value = "检修名称") private String overhaulName; @ApiModelProperty(value = "施工地点") private String constructionLocation; + @ApiModelProperty(value = "施工时间") + private Date constructionTime; + @ApiModelProperty(value = "检修负责人") @JsonSerialize(nullsUsing = NullSerializer.class) private Long overhaulHead; diff --git a/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/vo/ConstructionVo.java b/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/vo/ConstructionVo.java index e7244ad..8c1ee5c 100644 --- a/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/vo/ConstructionVo.java +++ b/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/vo/ConstructionVo.java @@ -1,10 +1,14 @@ package com.hnac.hzims.operational.access.vo; +import cn.afterturn.easypoi.entity.ImageEntity; import com.hnac.hzims.operational.access.entity.OperConstructionEntity; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import java.awt.image.BufferedImage; +import java.io.File; + /** * @author ysj */ @@ -17,4 +21,20 @@ public class ConstructionVo extends OperConstructionEntity { @ApiModelProperty(value = "结束时间") private String endTime; + + @ApiModelProperty(value = "年") + private String year; + + @ApiModelProperty(value = "月") + private String mon; + + @ApiModelProperty(value = "日") + private String day; + + @ApiModelProperty(value = "图片1") + private ImageEntity constructionImg1; + + @ApiModelProperty(value = "图片2") + private ImageEntity constructionImg2; + } diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/controller/ConstructionController.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/controller/ConstructionController.java index a27bce0..1653362 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/controller/ConstructionController.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/controller/ConstructionController.java @@ -49,7 +49,7 @@ public class ConstructionController extends BladeController { @ApiOperation(value = "新增") public R save(@RequestBody OperConstructionEntity entity) { entity.setCode("SGRZ" + DateUtil.format(new Date(),DateUtil.PATTERN_DATETIME_MINI)); - entity.setConstructionTime(DateUtil.format(new Date(),DateUtil.PATTERN_DATETIME)); + entity.setConstructionTime(entity.getOverhaulTime()); return R.status(service.save(entity)); } diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/service/impl/ConstructionServiceImpl.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/service/impl/ConstructionServiceImpl.java index dddf426..3eea192 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/service/impl/ConstructionServiceImpl.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/service/impl/ConstructionServiceImpl.java @@ -1,19 +1,24 @@ package com.hnac.hzims.operational.access.service.impl; -import cn.afterturn.easypoi.excel.entity.TemplateExportParams; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.word.WordExportUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.hnac.hzims.operational.access.entity.OperConstructionEntity; import com.hnac.hzims.operational.access.mapper.ConstructionMapper; import com.hnac.hzims.operational.access.service.ConstructionService; import com.hnac.hzims.operational.access.vo.ConstructionVo; -import com.hnac.hzims.operational.util.ExcelUtil; +import com.hnac.hzims.operational.util.PdfUtils; +import com.hnac.hzims.operational.util.WordUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.poi.ss.usermodel.Workbook; +import org.apache.commons.io.IOUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.mp.support.Condition; +import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.ObjectUtil; import org.springblade.core.tool.utils.StringUtil; import org.springframework.beans.factory.annotation.Value; @@ -21,7 +26,12 @@ import org.springframework.stereotype.Service; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; @@ -33,12 +43,8 @@ import java.util.Map; @RequiredArgsConstructor public class ConstructionServiceImpl extends BaseServiceImpl implements ConstructionService { - - @Value("${hzims.operational.construction.save.xlsx}") - private String constructionSaveXlsxPath; - - @Value("${hzims.operational.construction.save.pdf}") - private String constructionSavePdfPath; + @Value("${hzims.operation.construction.save.img}") + private String constructionSaveImgPath; /** * 施工日志记录分页查询 @@ -67,34 +73,36 @@ public class ConstructionServiceImpl extends BaseServiceImpl params = new HashMap<>(); - /*try { + try { params = PdfUtils.objectToMap(construction); }catch (Exception e) { log.error("转换对象失败!"); - }*/ - TemplateExportParams templateExportParams = new TemplateExportParams("template/constructio_template.xlsx", true); - Workbook workbook = null; + } + String fileName = construction.getCode() + "_" + construction.getOverhaulName() + "_施工日志" + PdfUtils.DOCX_SUFFIX; + XWPFDocument document; try { - workbook = ExcelUtil.getWorkbook(templateExportParams,params); + document = WordExportUtil.exportWord07("template/word/constructio_template.docx",params); } catch (Exception e) { - e.printStackTrace(); + throw new ServiceException("文件创建失败!"); } - //上传xlsx至服务器 - //String fileName = DateUtil.format(construction.getConstructionTime(),DateUtil.PATTERN_DATETIME) + "_" + construction.getOverhaulName() + "_施工日志" + PdfUtils.XLSX_SUFFIX; - /* try { - ExcelUtil.upload(workbook,constructionSaveXlsxPath,fileName); - } catch (Exception e) { + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/vnd.ms-excel"); + ServletOutputStream outputStream; + try { + //设置docx格式 + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".docx", "UTF-8")); + //创建一个输出流 + outputStream = response.getOutputStream(); + //写入数据 + document.write(outputStream); + // 关闭 + outputStream.close(); + document.close(); + } catch (IOException e) { e.printStackTrace(); - }*/ - //将docx文件转换为pdf并保存 - //String pdfFileName = DateUtil.format(construction.getConstructionTime(),DateUtil.PATTERN_DATETIME) + "_" + construction.getOverhaulName() + "_施工日志" + PdfUtils.PDF_SUFFIX; - //String xlsxFileName = DateUtil.format(construction.getConstructionTime(),DateUtil.PATTERN_DATETIME) + "_" + construction.getOverhaulName() + "_施工日志" + PdfUtils.XLSX_SUFFIX; - //PdfUtils.convertPdf(constructionSaveXlsxPath, xlsxFileName, constructionSavePdfPath, pdfFileName); - //String savePath = constructionSavePdfPath + pdfFileName; - // 设置response参数,可以打开下载页面 - //PdfUtils.readPdf(response,savePath); + } } /** @@ -102,11 +110,96 @@ public class ConstructionServiceImpl extends BaseServiceImpl 1){ + construction.setConstructionImg1(new ImageEntity(imgToByte(constructionSaveImgPath + downloadFileByUrl(imgArr[0],constructionSaveImgPath)), 225, 163)); + construction.setConstructionImg2(new ImageEntity(imgToByte(constructionSaveImgPath + downloadFileByUrl(imgArr[1],constructionSaveImgPath)), 225, 163)); + }else{ + construction.setConstructionImg1(new ImageEntity(imgToByte(constructionSaveImgPath + downloadFileByUrl(imgArr[0],constructionSaveImgPath)), 225, 163)); + } + } + if(StringUtil.isEmpty(construction.getConstructionAttachment())){ + construction.setConstructionAttachment(" "); + } + construction.setYear(DateUtil.format(construction.getConstructionTime(),"yyyy")); + construction.setMon(DateUtil.format(construction.getConstructionTime(),"MM")); + construction.setDay(DateUtil.format(construction.getConstructionTime(),"dd")); + return construction; + } + + /** + * 将图片转化为字节数组 + * + * @return 字节数组 + */ + private byte[] imgToByte(String tempImgPath) { + File file = new File(tempImgPath); + byte[] buffer = null; + try { + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(1000); + byte[] b = new byte[1000]; + int n; + while ((n = fis.read(b)) != -1) { + bos.write(b, 0, n); + } + fis.close(); + bos.close(); + buffer = bos.toByteArray(); + } catch (IOException e) { + log.error(e.getMessage()); + } + //删除临时文件 + file.delete(); + return buffer; + } + + /** + * 下载文件 + * @param fileUrl + * @param downloadFileDir + * @return + */ + private String downloadFileByUrl(String fileUrl, String downloadFileDir){ + URL url = null; + String fileName = null; + try { + url = new URL(fileUrl); + HttpURLConnection connection = (HttpURLConnection)url.openConnection(); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + connection.connect(); + + int responseCode = connection.getResponseCode(); + if (responseCode == 200) { + + InputStream inputStream = connection.getInputStream(); + + int lastSlashIndex = fileUrl.lastIndexOf("/"); + if (lastSlashIndex > 0){ + fileName = fileUrl.substring(lastSlashIndex+1); + String filePath = downloadFileDir + fileName; + File file = new File(filePath); + if (file.exists()){ + file.delete(); + } + OutputStream outputStream = new FileOutputStream(file); + // 将文件流拷贝到本地处理 + IOUtils.copy(inputStream, outputStream); + }else { + throw new ServiceException("下载文件路径异常:" + downloadFileDir); + } + } + } catch (Exception e) { + throw new ServiceException("文件图片下载失败!"); + } + return fileName; } } \ No newline at end of file diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/PdfUtils.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/PdfUtils.java new file mode 100644 index 0000000..d12e30b --- /dev/null +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/PdfUtils.java @@ -0,0 +1,320 @@ +package com.hnac.hzims.operational.util; + +import com.documents4j.api.DocumentType; +import com.documents4j.api.IConverter; +import com.documents4j.job.LocalConverter; +import com.hnac.hzims.operational.annotation.DefaultValue; +import com.hnac.hzims.ticket.constants.TicketConstants; +import com.spire.xls.FileFormat; +import com.spire.xls.Workbook; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.core.tool.utils.ObjectUtil; +import org.springblade.core.tool.utils.StringUtil; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.lang.reflect.Field; +import java.net.URLEncoder; +import java.nio.file.Files; +import java.time.LocalDateTime; +import java.util.*; + +/** + * @author hx + */ +@Slf4j +public class PdfUtils { + + /** 文件后缀名 **/ + public static String DOC_SUFFIX = ".doc"; + public static String DOCX_SUFFIX = ".docx"; + public static String XLS_SUFFIX = ".xls"; + public static String XLSX_SUFFIX = ".xlsx"; + public static String PDF_SUFFIX = ".pdf"; + + /*** + * 各文件转换为pdf + * @param templatePath 待转换的文件路径 + * @param templateFileName 待转换的文件名 + * @param savePath 转换为pdf后的文件路径 + * @param saveFileName 转换为pdf后的文件名称 + * @return + */ + public static void convertPdf(String templatePath, String templateFileName, String savePath, String saveFileName) { + String templateFilePath = templatePath + templateFileName; + String saveFilePath = savePath + saveFileName; + log.info("转换前的文件为:{};转换后的路径为:{}", templateFilePath, saveFilePath); + File templateFile = new File(templateFilePath); + File saveFile = new File(saveFilePath); + //获取文件类型 + String fileType = templateFileName.substring(templateFileName.lastIndexOf(".")); + InputStream inputStream = null; + OutputStream outputStream = null; + try { + try { + inputStream = Files.newInputStream(templateFile.toPath()); + outputStream = Files.newOutputStream(saveFile.toPath()); + //document4j 转换 pdf linux环境下不支持 + if (DOCX_SUFFIX.equals(fileType)) { + IConverter converter = LocalConverter.builder().build(); + converter.convert(inputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute(); + converter.shutDown(); + } else if (DOC_SUFFIX.equals(fileType)) { + IConverter converter = LocalConverter.builder().build(); + converter.convert(inputStream).as(DocumentType.DOC).to(outputStream).as(DocumentType.PDF).execute(); + converter.shutDown(); + } else if (XLS_SUFFIX.equals(fileType)) { + IConverter converter = LocalConverter.builder().build(); + converter.convert(inputStream).as(DocumentType.XLS).to(outputStream).as(DocumentType.PDF).execute(); + converter.shutDown(); + } else if (XLSX_SUFFIX.equals(fileType)) { + //此方式行不通 + //converter.convert(inputStream).as(DocumentType.XLSX).to(outputStream).as(DocumentType.PDF).execute(); + Workbook wb = new Workbook(); + wb.loadFromFile(templateFilePath); + wb.saveToFile(saveFilePath, FileFormat.PDF); + } + } catch (Exception e) { + log.error("转换失败,错误信息为:{}", e.getMessage()); + throw new ServiceException(e.getMessage()); + } finally { + inputStream.close(); + outputStream.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + + /** + * 对象转化为Map 并设置默认值 + * + * @param obj + * @return + * @throws Exception + */ + public static Map objectToMap(Object obj) { + Map result = new HashMap<>(); + if (ObjectUtil.isNotEmpty(obj)) { + Class clazz = obj.getClass(); + List fieldList = new ArrayList<>(); + while (clazz != null) { + fieldList.addAll(Arrays.asList(clazz.getDeclaredFields())); + clazz = clazz.getSuperclass(); + } + fieldList.forEach(field -> { + field.setAccessible(true); + DefaultValue defaultValue = field.getAnnotation(DefaultValue.class); + Object value; + try { + value = field.get(obj); + } catch (IllegalAccessException e) { + throw new ServiceException("获取属性性出错"); + } + //若为list则不处理 + if (value instanceof List) { + return; + } + //若为时间格式则进行格式化 + if (value instanceof LocalDateTime) { + value = DateUtil.format((LocalDateTime) value, TicketConstants.TICKET_DATE_PATTERN); + } + if (value instanceof Date) { + value = DateUtil.format((Date) value, TicketConstants.TICKET_DATE_PATTERN); + } + + //如果value为空直接跳出 + // if ((ObjectUtils.isEmpty(value) || value == "") && StringUtil.isNoneBlank(field.getName())){ + // return; + // } + + //属性上是否加入DefaultValue注解 若加入 则判断是否定义属性名以及值 若未定义则取原属性名及值 + if (ObjectUtil.isNotEmpty(defaultValue)) { + result.put(StringUtil.isNoneBlank(defaultValue.name()) ? defaultValue.name() : field.getName(), + ObjectUtil.isNotEmpty(defaultValue.value()) ? defaultValue.value() : value); + } else { + result.put(field.getName(), Optional.ofNullable(value).orElse(" ")); + + } + }); + } + return result; + } + + + /** + * 对象转化为Map 并设置默认值 + * + * @param obj + * @return + * @throws Exception + */ + public static Map objectToMap(Object obj, boolean isWordFlag) { + Map result = new HashMap<>(); + if (ObjectUtil.isNotEmpty(obj)) { + Class clazz = obj.getClass(); + List fieldList = new ArrayList<>(); + while (clazz != null) { + fieldList.addAll(Arrays.asList(clazz.getDeclaredFields())); + clazz = clazz.getSuperclass(); + } + fieldList.forEach(field -> { + field.setAccessible(true); + DefaultValue defaultValue = field.getAnnotation(DefaultValue.class); + Object value; + try { + value = field.get(obj); + } catch (IllegalAccessException e) { + throw new ServiceException("获取属性性出错"); + } + //若为list则不处理 + if (value instanceof List) { + return; + } + //若为时间格式则进行格式化 + if (value instanceof LocalDateTime) { + value = DateUtil.format((LocalDateTime) value, TicketConstants.TICKET_DATE_PATTERN); + } + if (value instanceof Date) { + value = DateUtil.format((Date) value, TicketConstants.TICKET_DATE_PATTERN); + } + + //如果value为空直接跳出 + // if ((ObjectUtils.isEmpty(value) || value == "") && StringUtil.isNoneBlank(field.getName())){ + // return; + // } + + //属性上是否加入DefaultValue注解 若加入 则判断是否定义属性名以及值 若未定义则取原属性名及值 + if (ObjectUtil.isNotEmpty(defaultValue)) { + result.put(StringUtil.isNoneBlank(defaultValue.name()) ? defaultValue.name() : field.getName(), + ObjectUtil.isNotEmpty(defaultValue.value()) ? defaultValue.value() : value); + } else { + if (isWordFlag) { + //如果导出word为null会出现{{ ,value设置"\u00A0" + result.put(field.getName(), Optional.ofNullable(value).orElse("\u00A0")); + } else { + result.put(field.getName(), Optional.ofNullable(value).orElse(" ")); + } + } + }); + } + return result; + } + + + /** + * 对象转化为Map 并设置默认值 + * + * @param obj + * @return + * @throws Exception + */ + public static Map objectToMapResult(Object obj, Map map) { + Map result = new HashMap<>(); + if (ObjectUtil.isNotEmpty(obj)) { + Class clazz = obj.getClass(); + List fieldList = new ArrayList<>(); + while (clazz != null) { + fieldList.addAll(Arrays.asList(clazz.getDeclaredFields())); + clazz = clazz.getSuperclass(); + } + fieldList.forEach(field -> { + field.setAccessible(true); + DefaultValue defaultValue = field.getAnnotation(DefaultValue.class); + Object value; + try { + value = field.get(obj); + } catch (IllegalAccessException e) { + throw new ServiceException("获取属性性出错"); + } + //若为list则不处理 + if (value instanceof List) { + return; + } + //若为时间格式则进行格式化 + if (value instanceof LocalDateTime) { + value = DateUtil.format((LocalDateTime) value, TicketConstants.TICKET_DATE_PATTERN); + } + if (value instanceof Date) { + value = DateUtil.format((Date) value, TicketConstants.TICKET_DATE_PATTERN); + } + + if (map.containsKey(field.getName())) { + return; + } + + //属性上是否加入DefaultValue注解 若加入 则判断是否定义属性名以及值 若未定义则取原属性名及值 + if (ObjectUtil.isNotEmpty(defaultValue)) { + result.put(StringUtil.isNoneBlank(defaultValue.name()) ? defaultValue.name() : field.getName(), + ObjectUtil.isNotEmpty(defaultValue.value()) ? defaultValue.value() : value); + } else { + //如果导出word为null会出现{{ ,value设置"\u00A0" + result.put(field.getName(), Optional.ofNullable(value).orElse("")); + } + }); + } + return result; + } + + + /** + * 读取本地pdf,这里设置的是预览 + */ + public static void readPdf(HttpServletResponse response, String filePath) { + response.reset(); + response.setContentType("application/pdf"); + FileInputStream fileInputStream = null; + OutputStream outputStream = null; + try { + File file = new File(filePath); + fileInputStream = new FileInputStream(file); + outputStream = response.getOutputStream(); + IOUtils.write(IOUtils.toByteArray(fileInputStream), outputStream); + response.setHeader("Content-Disposition", + "inline; filename= " + URLEncoder.encode(file.getName(), "UTF-8")); + outputStream.flush(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + fileInputStream.close(); + outputStream.close(); + + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 读取本地pdf,这里设置的是导出 + */ + public static void exportPdf(HttpServletResponse response, String filePath) { + response.reset(); + response.setContentType("application/pdf"); + FileInputStream fileInputStream = null; + OutputStream outputStream = null; + try { + File file = new File(filePath); + fileInputStream = new FileInputStream(file); + outputStream = response.getOutputStream(); + IOUtils.write(IOUtils.toByteArray(fileInputStream), outputStream); + response.setHeader("Content-Disposition", "inline; filename= " + URLEncoder.encode(file.getName(), "UTF-8")); + outputStream.flush(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + fileInputStream.close(); + outputStream.close(); + + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java index 5b28ec5..eafafad 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java @@ -6,17 +6,16 @@ import cn.hutool.core.lang.Assert; import com.hnac.hzims.operational.util.pojo.HttpResponse; import freemarker.cache.StringTemplateLoader; import freemarker.template.Configuration; -import org.apache.poi.xwpf.usermodel.XWPFDocument; -import org.apache.poi.xwpf.usermodel.XWPFTable; -import org.apache.poi.xwpf.usermodel.XWPFTableCell; -import org.apache.poi.xwpf.usermodel.XWPFTableRow; +import org.apache.poi.xwpf.usermodel.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge; +import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; -import java.io.File; -import java.io.FileOutputStream; -import java.io.UnsupportedEncodingException; +import java.awt.image.BufferedImage; +import java.io.*; import java.net.URLEncoder; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.List; import java.util.Map; @@ -91,7 +90,7 @@ public abstract class WordUtils { public static XWPFDocument exportWordV2(String templatePath, Map params) { try { XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); -// 合并第一列相同行的数据 + //合并第一列相同行的数据 tableIfSame(doc); return doc; } catch (Exception e) { diff --git a/hzims-service/operational/src/main/resources/log/logback-dev.xml b/hzims-service/operational/src/main/resources/log/logback-dev.xml deleted file mode 100644 index c67cdd9..0000000 --- a/hzims-service/operational/src/main/resources/log/logback-dev.xml +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - ${CONSOLE_LOG_PATTERN} - utf8 - - - - - - - - - log/info.log - - - log/info/info-%d{yyyy-MM-dd_HH}.%i.log - - 240 - - 20MB - 10GB - true - - - ${log.pattern} - - - - INFO - ACCEPT - DENY - - - - - - log/error.log - - - log/error/error-%d{yyyy-MM-dd_HH}.%i.log - - 360 - - 20MB - 10GB - true - - - ${log.pattern} - - - - ERROR - ACCEPT - DENY - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/hzims-service/operational/src/main/resources/log/logback-prod.xml b/hzims-service/operational/src/main/resources/log/logback-prod.xml deleted file mode 100644 index 3083e23..0000000 --- a/hzims-service/operational/src/main/resources/log/logback-prod.xml +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - ${CONSOLE_LOG_PATTERN} - utf8 - - - - - - - - - log/info.log - - - log/info/info-%d{yyyy-MM-dd_HH}.%i.log - - 240 - - 20MB - 10GB - true - - - ${log.pattern} - - - - INFO - ACCEPT - DENY - - - - - - log/error.log - - - log/error/error-%d{yyyy-MM-dd_HH}.%i.log - - 360 - - 20MB - 10GB - true - - - ${log.pattern} - - - - ERROR - ACCEPT - DENY - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/hzims-service/operational/src/main/resources/log/logback-test.xml b/hzims-service/operational/src/main/resources/log/logback-test.xml deleted file mode 100644 index fb3de3c..0000000 --- a/hzims-service/operational/src/main/resources/log/logback-test.xml +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - ${CONSOLE_LOG_PATTERN} - utf8 - - - - - - - - - - - log/error.log - - - log/error/error-%d{yyyy-MM-dd_HH}.%i.log - - 360 - - 20MB - 10GB - true - - - ${log.pattern} - - - - ERROR - ACCEPT - DENY - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/hzims-service/operational/src/main/resources/template/excel/constructio_template.xlsx b/hzims-service/operational/src/main/resources/template/excel/constructio_template.xlsx deleted file mode 100644 index 201df42805f492e2385a2649a8550ffb620fe490..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17960 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 diff --git a/hzims-service/operational/src/main/resources/template/word/constructio_template.docx b/hzims-service/operational/src/main/resources/template/word/constructio_template.docx new file mode 100644 index 0000000000000000000000000000000000000000..c59be0bcf55b8ae5e2c3d6bf52de7befce2bcd89 GIT binary patch literal 18910 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 Date: Wed, 10 Jan 2024 20:51:36 +0800 Subject: [PATCH 2/2] =?UTF-8?q?#=E6=96=BD=E5=B7=A5=E6=97=A5=E5=BF=97word?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hzims-service/operational/pom.xml | 23 ++++++++++++++++++++++ .../service/impl/ConstructionServiceImpl.java | 4 ++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/hzims-service/operational/pom.xml b/hzims-service/operational/pom.xml index cc0dbf1..fbb805c 100644 --- a/hzims-service/operational/pom.xml +++ b/hzims-service/operational/pom.xml @@ -18,6 +18,23 @@ + + + com.documents4j + documents4j-local + ${documents4j.version} + + + com.documents4j + documents4j-transformer-msoffice-word + ${documents4j.version} + + + com.documents4j + documents4j-UTIL-ALL + ${documents4j.version} + + redis.clients jedis @@ -232,6 +249,12 @@ swagger-bootstrap-ui ${swagger-bootstrap-ui.version} + + e-iceblue + spire.xls.free + 3.9.1 + compile + diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/service/impl/ConstructionServiceImpl.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/service/impl/ConstructionServiceImpl.java index 3eea192..33ed9c8 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/service/impl/ConstructionServiceImpl.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/service/impl/ConstructionServiceImpl.java @@ -88,11 +88,11 @@ public class ConstructionServiceImpl extends BaseServiceImpl