- 浏览: 1270556 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
ypzhangyx:
这要是个小白,看你的文章就得哭啊
AIX安装weblogic并部署web应用 -
cobly1837:
java encoding参考 -
lvwenwen:
very good! mark
银行业务细分,商业银行业务学习(二) -
waiting:
买过这3本书,的确有奇效!
读《火柴棒医生手记》,周尔晋奇人奇事 -
andy20008:
非NT服务修改JVM内存大小 与 NT服务修改JVM内存大小 ...
JIRA不完全手册
需求:一些金融机构需要很多报表,比如资产负债表,他们希望按照以往的习惯把报表放在一个文本文件里面,并且用空格和横竖线划成表格的样子,最终可以用于打印或者字符终端显示。报表文本文件样子如下:(html里面对不齐,可以用记事本打开附件)。
实现:报表数据在数据库,可以用jdbc查询出来,最终要生成文件,不由想到使用freemarker,那还需要的就是画一个ftl模版。
针对最终的文件形式,ftl如下:
生成文件的Main方法代码如下:
这个代码很不完善,比如没有异常捕获、Log机制、目标目录和用到的模版文件都是写死,仅仅作为测试使用。
xml 代码
- +------------------------------------------------------------------------
- | 资产 | 行 | 期初数 | 期末数 |
- | | 次 | | |
- |----------------------------+----+------------------+------------------+
- |流动资产 |0001| 0.00| 0.00|
- |----------------------------+----+------------------+------------------+
- | 现金及周转金 |0002| 96,482,019.59| 96,482,019.59|
- |----------------------------+----+------------------+------------------+
- | 存放中央银行款项 |0003| 0.00| 0.00|
- |----------------------------+----+------------------+------------------+
- | 专项央行票据 |0004| 0.00| 0.00|
- |----------------------------+----+------------------+------------------+
- | 央行专项扶持资金 |0005| 0.00| 0.00|
- |----------------------------+----+------------------+------------------+
- | 存放同业款项 |0006| 0.00| 0.00|
- |----------------------------+----+------------------+------------------+
- | 存放联行款项 |0007| 0.00| 0.00|
- |----------------------------+----+------------------+------------------+
- | 拆放同业 |0008| 0.00| 0.00|
- |----------------------------+----+------------------+------------------+
- | 拆放金融性公司 |0009| 0.00| 0.00|
- |----------------------------+----+------------------+------------------+
实现:报表数据在数据库,可以用jdbc查询出来,最终要生成文件,不由想到使用freemarker,那还需要的就是画一个ftl模版。
针对最终的文件形式,ftl如下:
java 代码
- %%${organization.number}
- <#assign prepage=0>
- <#assign pagenumber=30>
- <#assign currentnumber=0>
- <#assign currentpage=1>
- <#list rows as row>
- <#if (prerow?exists && prerow.curr_cd != row.curr_cd)>
- <#assign currentpage = currentpage + 1>
- <#assign currentnumber=0>
- +-----------------------------------------------------------------------------------------------------------------------------------------------+
- 事后监督 主管 复核 制表 报表日期 ${date?string("yyyy/MM/dd")}
- <!---->if>
- <#if currentnumber % pagenumber == 0> @@ xx金融机构资产负债表 &&
- 单位名称 ${organization.name} 报表类型 日报 制表日期 ${date?string("yyyy")} 年 ${date?string("MM")} 月 ${date?string("dd")} 日 币种 ${row.curr_cd}
- 单位: 元 第 ${currentpage} 页
- +-----------------------------------------------------------------------------------------------------------------------------------------------+
- | 资产 | 行 | 期初数 | 期末数 | 资产 | 行 | 期初数 | 期末数 |
- | | 次 | | | | 次 | | |
- <!---->if>
- |----------------------------+----+------------------+------------------+----------------------------+----+------------------+------------------|
- |${row.item_name}|${row.line_no?string("0000")}|${row.begin_bal?string("#,##0.00")?left_pad(18)}|${row.end_bal?string("#,##0.00")?left_pad(18)}|${row.item_name2}|${row.line_no?string("0000")}|${row.begin_bal2?string("#,##0.00")?left_pad(18)}|${row.end_bal2?string("#,##0.00")?left_pad(18)}|
- <#if (currentnumber % pagenumber == pagenumber - 1) || (row_has_next == false)>
- +-----------------------------------------------------------------------------------------------------------------------------------------------+
- 事后监督 主管 复核 制表 报表日期 ${date?string("yyyy/MM/dd")}
- <#assign currentpage = currentpage + 1><!---->if>
- <#assign prerow = row>
- <#assign prepage = currentpage>
- <#assign currentnumber = currentnumber + 1>
- <!---->
生成文件的Main方法代码如下:
java 代码
- import java.io.BufferedWriter;
- import java.io.File;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.sql.Connection;
- import java.sql.Date;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.text.SimpleDateFormat;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import freemarker.template.Configuration;
- import freemarker.template.DefaultObjectWrapper;
- import freemarker.template.Template;
- /**
- * @author arthur
- * @version $Revision: 1.1 $
- */
- public class Test {
- public static void main(String[] args) throws Exception {
- Class.forName("com.ibm.db2.jcc.DB2Driver");
- Connection conn = DriverManager.getConnection("jdbc:db2://ip:port/dbname", "username", "pwd");
- StringBuffer sb = new StringBuffer(
- "select record_date,cycle_no,bank_no,curr_cd,line_no,item_name,item_no,begin_bal,end_bal,item_name2,item_no2,begin_bal2,end_bal2 from FIN_BALANCE_REPORT ");
- sb.append("where RECORD_DATE = ?");
- sb.append("order by cycle_no,BANK_NO,CURR_CD,line_no");
- PreparedStatement pstmt = conn.prepareStatement(sb.toString());
- Date date = Date.valueOf("2006-6-30");
- pstmt.setDate(1, date);
- ResultSet rs = pstmt.executeQuery();
- Map root = new HashMap();
- List rows = new ArrayList();
- Map org = new HashMap();
- int pre_cycle_no = -1;
- String pre_bank_no = "";
- while (rs.next()) {
- Map row = new HashMap();
- int cycle_no = rs.getInt("cycle_no");
- String bank_no = rs.getString("bank_no");
- if (pre_cycle_no != -1 && pre_cycle_no != cycle_no
- || (pre_bank_no.length() > 0 && !pre_bank_no.equals(bank_no))) {// 另外一个cycle_no和bank_no
- org.put("number", pre_bank_no);
- org.put("name", pre_bank_no);
- root.put("organization", org);
- root.put("date", date);
- root.put("rows", rows);
- Configuration cfg = new Configuration();
- cfg.setDirectoryForTemplateLoading(new File("D:/work/template/"));
- cfg.setObjectWrapper(new DefaultObjectWrapper());
- Template temp = cfg.getTemplate("资产负债表.ftl");
- String dateString = new SimpleDateFormat("yyyyMMdd").format(date);
- String fileName = "T" + pre_bank_no + "_" + dateString + "_" + pre_cycle_no + pre_bank_no;
- File file = new File("D:/work/dest/" + fileName);
- FileWriter fw = new FileWriter(file);
- try {
- BufferedWriter bw = new BufferedWriter(fw);
- temp.process(root, bw);
- bw.flush();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- fw.close();
- }
- rows = new ArrayList();
- }
- int line_no = rs.getInt("line_no");
- row.put("line_no", new Integer(line_no));
- row.put("item_name", rightPad(rs.getString("item_name"), 28));
- row.put("begin_bal", rs.getBigDecimal("begin_bal"));
- row.put("end_bal", rs.getBigDecimal("end_bal"));
- row.put("item_name2", rightPad(rs.getString("item_name2"), 28));
- row.put("begin_bal2", rs.getBigDecimal("begin_bal2"));
- row.put("end_bal2", rs.getBigDecimal("end_bal2"));
- row.put("curr_cd", rs.getString("curr_cd"));
- rows.add(row);
- root = new HashMap();
- pre_cycle_no = cycle_no;
- pre_bank_no = bank_no;
- }
- rs.close();
- pstmt.close();
- conn.close();
- }
- /**
- * 汉字算2位的右边补齐空格方法
- */
- public static String rightPad(String s, int minLength) {
- int ln = length(s);
- if (minLength <= ln) {
- return s;
- }
- StringBuffer res = new StringBuffer(minLength);
- res.append(s);
- int dif = minLength - ln;
- for (int i = 0; i < dif; i++) {
- res.append(' ');
- }
- return res.toString();
- }
- /**
- * 汉字算2位的左边补齐空格方法
- */
- public static String leftPad(String s, int minLength) {
- int ln = length(s);
- if (minLength <= ln) {
- return s;
- }
- StringBuffer res = new StringBuffer(minLength);
- int dif = minLength - ln;
- for (int i = 0; i < dif; i++) {
- res.append(' ');
- }
- res.append(s);
- return res.toString();
- }
- /**
- * 汉字算2位的String length计算方法
- */
- public static int length(String s) {
- int counter = 0;
- for (int i = 0; i < s.length(); i++) {
- char c = s.charAt(i);
- if (c < 255) {
- counter++;
- } else {
- counter = counter + 2;
- }
- }
- return counter;
- }
- }
这个代码很不完善,比如没有异常捕获、Log机制、目标目录和用到的模版文件都是写死,仅仅作为测试使用。
- 报表文件.zip (2.3 KB)
- 下载次数: 209
发表评论
-
继续说代理:用apache给tomcat/weblogic设置代理
2009-08-14 14:03 6304mod_proxy 是Apache 自带的 模块使用代理技术来 ... -
mysql errorcode: 17的原因及解决
2009-04-09 16:22 3456Caused by: java.sql.SQLExceptio ... -
用foxit reader 3.0快速建立pdf书签
2009-02-12 12:33 8709foxit reader 2.3之后加入了自定义书签的功能,官 ... -
strokeit
2008-12-19 17:34 0http://www.wecycling.com/index. ... -
Cognos reportnet开启权限认证针对空报表拆分产生的exception是不同的
2008-12-17 15:50 3329未开启权限认证时,即 ... -
FT,有时候重新设定环境变量还得重启Windows机器
2008-11-25 11:46 2419一台windows 2003 server机器,安装了cogn ... -
ping Source quench received
2008-10-28 15:27 2605ping error "source requenc ... -
foxmail没法压缩邮箱的解决办法
2008-10-28 09:32 5244通过Gmail发送了几个超大的邮件,最大的一个有20万行 ... -
beyond compare3使用
2008-08-27 23:42 41721.比较文本数据差异。 文本数据指的是类似csv文件的数据、定 ... -
svn:ignore
2008-07-04 14:44 76731.已经在版本控制的目录或者文件是不能加入svn:ignore ... -
Foxmail邮件备份到Gmail
2008-05-20 17:21 6187Gmail不断增长貌似无限制的空间+强大的搜索功能 用于储存邮 ... -
spring bean继承的一个误解
2007-06-05 15:22 3020xxAction继承BaseAction,BaseAction ... -
Maven,想说爱你不容易..
2007-05-27 15:25 2175你用maven你会感觉很环保,但是网络不通的时候却又是无尽的烦 ... -
定时加载文件到数据库tips
2007-05-22 17:50 4449装载文本文件,oracle sqlldr是个好用的工具。 如 ... -
javafx,又一个applet?
2007-05-09 18:26 5358JavaOne 出来的东西,demo和文档:https://o ... -
xwork升级到1.2 反而多了些小问题
2007-04-18 19:12 25991.每调用一个action都给出几条警告: WARN [com ... -
在many-to-many的中间表中配置索引
2007-04-11 15:44 5030<set name="cards" ... -
喜新厌旧的后果
2007-04-10 15:43 2143一直用pl/sql dev 6.0好好的,但是看到最新版本都是 ... -
jboss rules3.1m终于用了一个el:mvel,性能与ognl的对比有些让人吃惊
2007-04-10 13:41 8130引用 Later I will also move templ ... -
加班被锁,郁闷...
2007-04-05 20:25 3690等待解救中...
相关推荐
在Java开发中,利用FreeMarker生成Word文件可以极大地提高效率,尤其在需要批量生成或者自定义模板的情况下。以下是对这个主题的详细阐述: ### FreeMarker简介 FreeMarker是一个开源的、基于模板的Java库,它将...
总结来说,通过Java-Freemarker生成Word文档的关键步骤包括:创建Word模板、转换为XML、编辑XML模板,以及使用Freemarker的模板引擎将数据注入XML模板生成最终的Word文档。这个过程大大简化了动态生成Word文档的复杂...
结合SpringBoot和JPA,我们可以创建一个服务,该服务使用JPA的Repository接口与数据库进行交互,并通过Freemarker生成动态SQL。具体步骤如下: 1. **设置项目**:创建一个SpringBoot项目,添加Spring Data JPA和...
你需要在这里定义数据模型,加载Freemarker模板,设置输出文件路径,然后调用Freemarker的API来生成文档。具体步骤如下: - 创建一个`Configuration`对象,配置Freemarker的模板目录。 - 加载Freemarker模板文件,...
最后,运行`WordUtil`类中的`main`函数,调用`WordService.generateWord()`方法,传入必要的参数,就可以生成包含图片的Word文档了。 这个项目为我们提供了一个实用的工具,可以方便地根据模板生成动态的Word文档,...
这个"freemarker Demo"项目应该包含了基本的模板文件、Struts2配置以及相关的Java代码,通过实际运行和修改这些文件,初学者可以更好地理解Freemarker的工作原理和使用方法。在学习过程中,可以逐步尝试不同的表达式...
- 主类:通常包含`main`方法,是程序的入口点,负责初始化FreeMarker环境,读取数据,调用FreeMarker模板进行渲染。 - 配置文件:可能包含`freemarker.properties`或`application.properties`等,用于设置...
使用FreeMarker生成Word文档,首先需要准备一个`.ftl`模板文件,定义好文档的结构和占位符,然后在Java代码中解析模板并替换占位符为实际数据。 三、生成Word文档步骤 1. 添加依赖:在项目中引入FreeMarker和用于...
Freemarker是一个强大的模板引擎,主要用于生成文本输出,尤其在HTML Web页面的生成上非常有用。它是用Java编写的,并且常被用作MVC模式应用程序的一部分,而非完整的Web应用框架。Freemarker的核心思想是将数据模型...
FreeMarker则是一种模板引擎,用于生成动态HTML或其他格式的文本输出。 首先,我们需要设置项目结构。一个标准的Spring MVC项目通常包含以下几个主要部分:`src/main/java`、`src/main/resources`、`src/main/...
代码生成过程中,可能使用到了模板引擎,这里提到了`freemarker-2.3.19.jar`,这是一个强大的Java模板引擎,用于动态生成文本输出,如HTML页面、XML文档或者Java源代码。 Freemarker模板语言允许开发者定义一套规则...
- FreeMarker是一个基于模板的生成器,主要用在Web应用中生成动态内容,但也可用于生成任何类型的文本输出,包括Word文档。 - 它的工作原理是:模板文件(.ftl)包含静态文本和变量,变量由Java对象的值填充。 - ...
实际上,FreeMarker支持更复杂的逻辑操作,如条件判断(`<#if>`)、循环(`<#foreach>`)、函数调用等,能够满足各种动态生成文本的需求。 通过阅读这篇博客文章(https://wildwolfjack.iteye.com/blog/591048),...
在这个例子中,`hello` 方法返回的 "hello" 就是 FreeMarker 模板的名称,Spring 会自动查找对应的 `hello.ftl` 文件。 ### 5. 运行与测试 完成上述配置后,启动 Spring 应用,访问 `http://localhost:8080/hello`...
下面是一个简单的Java代码片段,展示了如何使用Apache POI和FreeMarker生成Word文件: ```java import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template....
- `src/main/resources/templates` 目录下应该存放 Freemarker 模板文件,如 `index.ftl`,其中可以见到自定义标签的使用。 - `src/main/java` 目录下的 Controller 类可能包含处理请求和返回数据的方法,如 `...
当用户访问`/hello`路径时,Spring MVC会调用`HelloController`中的`hello`方法,该方法将“你好,Spring MVC + Freemarker!”消息放入模型数据中,并指定视图为`hello.ftl`。Freemarker模板引擎随后会根据这个视图...
在本教程中,我们将深入探讨如何在Java项目中使用Freemarker生成静态页面,以及其基本语法。 首先,了解Freemarker的基本概念是必要的。它是一个模板语言,允许开发者用简单的标记来控制输出内容。Freemarker与后端...