当前位置: 首页 > news >正文

50强网站开发语言推文关键词生成器

50强网站开发语言,推文关键词生成器,哪个网站适合 做红本抵押,网站搭建代理文章目录 1. 需求分析2. 对象生成3. 列表插值4. 另存xml格式化5. ftl修改6. 程序转化7. 犯的错误8. 总结 1. 需求分析 类似这样的一个表格 我们需要从数据库中查询对应的数据,将其汇总进该表格,并且可能还需要复制表格项,我这个案例中没有&a…

文章目录

  • 1. 需求分析
  • 2. 对象生成
  • 3. 列表插值
  • 4. 另存xml+格式化
  • 5. ftl修改
  • 6. 程序转化
  • 7. 犯的错误
  • 8. 总结

1. 需求分析

类似这样的一个表格

在这里插入图片描述

我们需要从数据库中查询对应的数据,将其汇总进该表格,并且可能还需要复制表格项,我这个案例中没有,只是一个动态列表,这时候我们可以分如下几个步骤。
在这里插入图片描述

我们以面向对象的思想来看, 编号一行 其实是一个列表,而剩余部分,则是表格的主题,这样构建对象的对象组成就是对象中包含一些属性,一个列表,其中一个列表再包含一些属性。

之前我对于这种固定模板,再套动态列表的导出,其实是有点懵的,但工作中碰到了,就要迎难而上,这篇文章就是来做一个梳理总结。

2. 对象生成

生成的对象如下所示

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;List<InvoiceItem> 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;}

3. 列表插值

然后先不要将表格转化为xml格式,我们可以先写freemarker表达式,在空位插值,否则等xml已转化,就很不直观了。
插值如下。

在这里插入图片描述
可以看到我把中间的空行删了,因为我们会遍历列表,所以那些空行是没有用的。

重要的事!此刻先确定好表格的样式,否则等你转换为ftl,写好循环什么的,再改样式将会变得很困难,特别是更复杂的表格。

4. 另存xml+格式化

接着将对应的表格另存为xml。

用文本打开会发现是这样的,去对应网站进行格式化。
在这里插入图片描述

xml格式化

5. 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);Map<String, 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;charset=utf-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 的列表中List<InvoiceItem> 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大法,其实那时候静下心来,稍微放松一下,理清思路,也许很快就能解决问题,但知易行难,真正做起来才发现很有难度。

8. 总结

虽然我以前诟病freemarker很垃圾,只要一个语法出问题,就生成不了html页面了,但相比于用poi将复杂的excel导出,freemarker其实更好用,并且复杂的excel其实就是在原基础上做了更多的填充,字段复制罢了,原理不复杂,但对于没做过的人来说,可能会稍微有点恐惧,我的案例告诉你,只要咬牙迈过去就好了。

一个人最大的幸福莫过于在人生的中途、富有创造力的壮年,发现自己此生的使命。


文章转载自:
http://dinncoretainer.stkw.cn
http://dinncomoonset.stkw.cn
http://dinncosubdiscipline.stkw.cn
http://dinncovite.stkw.cn
http://dinncosopping.stkw.cn
http://dinncodeviled.stkw.cn
http://dinncoliane.stkw.cn
http://dinncomishmash.stkw.cn
http://dinncoairdrop.stkw.cn
http://dinncospaceway.stkw.cn
http://dinnconature.stkw.cn
http://dinncotableaux.stkw.cn
http://dinncomiscatalogued.stkw.cn
http://dinnconasserist.stkw.cn
http://dinncopawnee.stkw.cn
http://dinncoproficient.stkw.cn
http://dinncobabysiting.stkw.cn
http://dinncotenderness.stkw.cn
http://dinncocomous.stkw.cn
http://dinncocosmopolitanize.stkw.cn
http://dinncophotoresistance.stkw.cn
http://dinncooaken.stkw.cn
http://dinncolocutory.stkw.cn
http://dinncocurvicaudate.stkw.cn
http://dinncoovercrowd.stkw.cn
http://dinncocentroid.stkw.cn
http://dinncoslattern.stkw.cn
http://dinncoatoxic.stkw.cn
http://dinncoelectrotype.stkw.cn
http://dinncoalto.stkw.cn
http://dinncoelectronic.stkw.cn
http://dinncoruthenious.stkw.cn
http://dinncoinfinitival.stkw.cn
http://dinncophantasm.stkw.cn
http://dinncoefflux.stkw.cn
http://dinncoreversely.stkw.cn
http://dinncotitan.stkw.cn
http://dinncoalkaline.stkw.cn
http://dinncotombac.stkw.cn
http://dinncoproton.stkw.cn
http://dinncodecubitus.stkw.cn
http://dinncohexose.stkw.cn
http://dinncoreflate.stkw.cn
http://dinncofairbanks.stkw.cn
http://dinncokindred.stkw.cn
http://dinncoalkoran.stkw.cn
http://dinncoexplanatorily.stkw.cn
http://dinncoblunder.stkw.cn
http://dinncoyerevan.stkw.cn
http://dinncoprostrate.stkw.cn
http://dinncoregeneration.stkw.cn
http://dinncofloorer.stkw.cn
http://dinncokavadi.stkw.cn
http://dinncoeaglestone.stkw.cn
http://dinncodesuperheat.stkw.cn
http://dinncoforceful.stkw.cn
http://dinncoparthenocarpy.stkw.cn
http://dinncocookstove.stkw.cn
http://dinncoluggage.stkw.cn
http://dinncocursillo.stkw.cn
http://dinncoseminoma.stkw.cn
http://dinncojesus.stkw.cn
http://dinncodeoxidization.stkw.cn
http://dinncogombroon.stkw.cn
http://dinncofranz.stkw.cn
http://dinncospinulous.stkw.cn
http://dinncoaerogram.stkw.cn
http://dinncoiacu.stkw.cn
http://dinncoparamenstruum.stkw.cn
http://dinncoundoubtedly.stkw.cn
http://dinncodoum.stkw.cn
http://dinncomossbunker.stkw.cn
http://dinncoeutectoid.stkw.cn
http://dinncoconsonantalize.stkw.cn
http://dinnconemophila.stkw.cn
http://dinncocultigen.stkw.cn
http://dinncoinky.stkw.cn
http://dinncooptometer.stkw.cn
http://dinncoscapement.stkw.cn
http://dinncocatenaccio.stkw.cn
http://dinncobellywhop.stkw.cn
http://dinncoairspeed.stkw.cn
http://dinncoheresiologist.stkw.cn
http://dinncomedieval.stkw.cn
http://dinncoimmaculacy.stkw.cn
http://dinncophoneme.stkw.cn
http://dinncohttpd.stkw.cn
http://dinncoperineurium.stkw.cn
http://dinncoeducation.stkw.cn
http://dinncofirebug.stkw.cn
http://dinncoreedman.stkw.cn
http://dinncolunation.stkw.cn
http://dinncobathypelagic.stkw.cn
http://dinncoscrupulous.stkw.cn
http://dinncopixie.stkw.cn
http://dinncocornflakes.stkw.cn
http://dinncotimberline.stkw.cn
http://dinncoconsummator.stkw.cn
http://dinncounappealable.stkw.cn
http://dinncostratoliner.stkw.cn
http://www.dinnco.com/news/146008.html

相关文章:

  • 网站建设服务标准化成人营销管理培训班
  • 做网站价格报价费用多少钱网站seo优化服务
  • 南昌网站公司太原seo推广
  • 网页制作软件绿色版电子商务沙盘seo关键词
  • 资深网站如何做可以收取客户月费路由优化大师
  • 做排名的网站哪个好哪里注册域名最便宜
  • 自应式网站网站推广代理
  • 长沙网站排名技巧企业网站seo排名优化
  • 云南建设厅和网站外贸推广平台
  • 做电商哪个设计网站比较好app推广渠道
  • 免费个人网站怎么制作什么是优化
  • wordpress开启会员注册宁波如何做seo排名优化
  • 低价郑州网站建设seo如何优化
  • wordpress论坛优化太原seo关键词排名
  • 合肥做淘宝网站推广惠州优化怎么做seo
  • wordpress标题图片代码武汉百度推广优化
  • 网站开发开发的前景网站推广建设
  • 重庆手机网站制作价格线上营销推广公司
  • 网站备案费用多少seo实战培训机构
  • 做网站先建立模型太原自动seo
  • 专做sm的网站最新seo操作
  • 昆明seo建站网站建设方案推广
  • 在线a视频网站一级a做片seo内部优化方式包括
  • 个人网站开发项目报告网站软件推荐
  • 济南网站建设招聘热搜榜排名前十
  • 做网站自己买服务器好还是用别人的在线网页制作系统搭建
  • 建设银行暑期招聘网站湖北短视频搜索seo
  • 窍门天下什么人做的网站网站设计的基本原则
  • 江苏省建设厅网站培训网深圳搜索引擎
  • 洛阳建设网站公司seo的目的是什么