东莞创意网站设计效果图企信网企业信用信息系统
- 作者: 五速梦信息网
- 时间: 2026年03月21日 11:21
当前位置: 首页 > news >正文
东莞创意网站设计效果图,企信网企业信用信息系统,站内推广和站外推广的区别,seo工资水平文章目录 1. 需求分析2. 对象生成3. 列表插值4. 另存xml格式化5. ftl修改6. 程序转化7. 犯的错误8. 总结 1. 需求分析
类似这样的一个表格 我们需要从数据库中查询对应的数据#xff0c;将其汇总进该表格#xff0c;并且可能还需要复制表格项#xff0c;我这个案例中没有格式化5. ftl修改6. 程序转化7. 犯的错误8. 总结 1. 需求分析
类似这样的一个表格 我们需要从数据库中查询对应的数据将其汇总进该表格并且可能还需要复制表格项我这个案例中没有只是一个动态列表这时候我们可以分如下几个步骤。
我们以面向对象的思想来看 编号一行 其实是一个列表而剩余部分则是表格的主题这样构建对象的对象组成就是对象中包含一些属性一个列表其中一个列表再包含一些属性。
之前我对于这种固定模板再套动态列表的导出其实是有点懵的但工作中碰到了就要迎难而上这篇文章就是来做一个梳理总结。
- 对象生成 生成的对象如下所示 Invoice类 Data AllArgsConstructor NoArgsConstructor public class Invoice {// 客户名称private String customerName;// 客户编码private String customerCode;// 日期private Date date;// 总合计大写private String totalAmountInWords;// 合计private BigDecimal totalAmount;// 主管private String supervisor;// 财务private String finance;// 保管员private String custodian;// 经手人private String handler;ListInvoiceItem invoiceItemList; } InvoiceItem类 Data AllArgsConstructor NoArgsConstructor public class InvoiceItem {// 编号private String itemNumber;// 名称及规格private String itemNameAndSpecs;// 单位private String unit;// 数量private int quantity;// 单价private BigDecimal unitPrice;// 金额private BigDecimal amount;// 备注private String comments;}
- 列表插值 然后先不要将表格转化为xml格式我们可以先写freemarker表达式在空位插值否则等xml已转化就很不直观了。 插值如下。 可以看到我把中间的空行删了因为我们会遍历列表所以那些空行是没有用的。 重要的事此刻先确定好表格的样式否则等你转换为ftl写好循环什么的再改样式将会变得很困难特别是更复杂的表格。
- 另存xml格式化
接着将对应的表格另存为xml。
用文本打开会发现是这样的去对应网站进行格式化。
xml格式化 - ftl修改 我们可以将格式化后的代码复制到该文件 /templates/demo.ftl 你们随意命名即可。 我们找到worksheet这一行下面的就是我们要更改的地方了。 因为我们只需要遍历列表即可所以只需要在编号填充的上面引入列表即可不要忘了在对应的地方结束循环。 6. 程序转化 service代码如下 Service Slf4j public class ExcelService {/*** 1.查询对象* 2.封装map* 3.指定模板与导出文件名称* 4.响应设置 不设置会导致乱码 文件格式出错等问题* 5.模板配置* 6.变量替换* 7.文件输出* param id 商品id*/public void export(Integer id, HttpServletResponse response) {//这里假装查询对应的对象 我处于方便直接让ai生成了Invoice invoice getById(1);MapString, Object model new HashMap();//要与ftl中的对象一致model.put(invoice, invoice);// 指定FreeMarker模板文件的位置String templateFilePath demo.ftl;String excelName 商品出库单 .xlsx;FileInputStream inputStream null;ServletOutputStream outputStream null;File file null;// 使用FreeMarker加载模板文件try {response.reset();response.setHeader(Content-Disposition, attachment;filename URLEncoder.encode(excelName, UTF8));response.setCharacterEncoding(utf-8);response.setContentType(application/vnd.ms-excel;charsetutf-8);Configuration cfg new Configuration(Configuration.getVersion());// 指定FreeMarker模板文件的位置String path /templates/;cfg.setClassForTemplateLoading(getClass(), path);Template template cfg.getTemplate(templateFilePath);file new File(excelName);FileWriter out new FileWriter(excelName);// 变量替换template.process(model, out);// 将文件输出到response,返回给客户端inputStream new FileInputStream(file);byte[] buffer new byte[inputStream.available()];inputStream.read(buffer);inputStream.close();outputStream response.getOutputStream();outputStream.write(buffer);outputStream.flush();outputStream.close();} catch (Exception e) {log.error(出库单导出失败, e);throw new RuntimeException(e);}}public static Invoice getById(Integer id) {// 创建一个 Invoice 对象Invoice invoice new Invoice();invoice.setCustomerName(客户名称示例);invoice.setCustomerCode(客户编码示例);invoice.setDate(new Date());invoice.setTotalAmountInWords(总合计大写示例);invoice.setTotalAmount(new BigDecimal(1000.00));invoice.setSupervisor(主管示例);invoice.setFinance(财务示例);invoice.setCustodian(保管员示例);invoice.setHandler(经手人示例);// 创建并填充 5 个 InvoiceItem 对象然后添加到 Invoice 的列表中ListInvoiceItem invoiceItems new ArrayList();for (int i 1; i 5; i) {InvoiceItem item new InvoiceItem();item.setItemNumber(编 号 i);item.setItemNameAndSpecs(名称及规格示例 i);item.setUnit(单位示例);item.setQuantity(10 * i);item.setUnitPrice(new BigDecimal(10.00));item.setAmount(new BigDecimal(100.00));item.setComments(备注示例 i);invoiceItems.add(item);}invoice.setInvoiceItemList(invoiceItems);return invoice;}} controller 调用 RestController public class ExportController {Autowiredprivate ExcelService excelService;GetMapping(/export)public void export(Integer id, HttpServletResponse response) {excelService.export(1, response);} } 生成的表格如下所示可以看到效果还不错的。 7. 犯的错误 但是 你以为这就完了吗 我之前做的表格比这复杂很多导致遇到了很多错误。 比如文件路径错误模板错误excel格式不支持错误。样式不整齐乱码读出错误。 现在一一列举下我犯的错所以这不单单是一个教学贴也是对我错误的一个总结。 1.文件路径错误。 在写这段代码的时候由于路径藏的很深且我以为第二个参数不能直接这么用要填写全路径导致文件一致读取失败现在明白了只需要直接填充根路径往下的内容即可。 // 指定FreeMarker模板文件的位置String path /templates/;cfg.setClassForTemplateLoading(getClass(), path);2.对异常的不关注。 之前读取文件失败还有个原因是ftl语法错误但我打的异常并不明显导致我一直没看到这个错误计算把文件路径修复了还是会报错其实是找错了方向提醒大家要注意异常当时是日志太多了确实忽略了这一点。 3.excel文件转化打不开。 其中一点我们打开之前的xml文件找到这两个字段 建议将这两个值改的大一点否则文件格式会出问题我这里是因为数据量少没出问题但真实使用就不一定了改个几百几千都可以。 还有一点之前xml进行了格式化但到了idea中头文件内容错乱了这点才导致文件无法打开建议从之前的xml模板中复制头文件在原基础上修改即可。 4.乱码 特别是中文命名的文件一定要设置utf8格式之前的response的设置可不是白加的。 5.freemarker空值问题 一旦某一个地方比如日期列表之类的为空整个渲染就报错了所以一定要提前判断某些地方会不会为null提前设置默认值一般来讲在表达式后面加即可当然只针对于字符串什么的。 6.遇到bug时的盲目 那时因为需求急就算碰到了问题也是一个劲的百度cv大法其实那时候静下心来稍微放松一下理清思路也许很快就能解决问题但知易行难真正做起来才发现很有难度。
- 总结 虽然我以前诟病freemarker很垃圾只要一个语法出问题就生成不了html页面了但相比于用poi将复杂的excel导出freemarker其实更好用并且复杂的excel其实就是在原基础上做了更多的填充字段复制罢了原理不复杂但对于没做过的人来说可能会稍微有点恐惧我的案例告诉你只要咬牙迈过去就好了。 一个人最大的幸福莫过于在人生的中途、富有创造力的壮年发现自己此生的使命。
- 上一篇: 东莞常平医院网站建设统码营销官网
- 下一篇: 东莞创意网站设计住房和建设厅官方网站
相关文章
-
东莞常平医院网站建设统码营销官网
东莞常平医院网站建设统码营销官网
- 技术栈
- 2026年03月21日
-
东莞常平建网站公司网站设计制作一条龙多少钱
东莞常平建网站公司网站设计制作一条龙多少钱
- 技术栈
- 2026年03月21日
-
东莞北京网站建设价格在网站建设论文的基本分析
东莞北京网站建设价格在网站建设论文的基本分析
- 技术栈
- 2026年03月21日
-
东莞创意网站设计住房和建设厅官方网站
东莞创意网站设计住房和建设厅官方网站
- 技术栈
- 2026年03月21日
-
东莞地产网站建设jquery做的网站
东莞地产网站建设jquery做的网站
- 技术栈
- 2026年03月21日
-
东莞电商网站公司wordpress空间服务商
东莞电商网站公司wordpress空间服务商
- 技术栈
- 2026年03月21日






