`
eyejava
  • 浏览: 1270556 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

用Main方法调用freemarker生成文本文件

阅读更多
需求:一些金融机构需要很多报表,比如资产负债表,他们希望按照以往的习惯把报表放在一个文本文件里面,并且用空格和横竖线划成表格的样子,最终可以用于打印或者字符终端显示。报表文本文件样子如下:(html里面对不齐,可以用记事本打开附件)。
xml 代码
  1. +------------------------------------------------------------------------  
  2. |             资产           | 行 |  期初数          |  期末数          |  
  3. |                            | 次 |                  |                  |  
  4. |----------------------------+----+------------------+------------------+  
  5. |流动资产                    |0001|              0.00|              0.00|  
  6. |----------------------------+----+------------------+------------------+  
  7. |  现金及周转金              |0002|     96,482,019.59|     96,482,019.59|  
  8. |----------------------------+----+------------------+------------------+  
  9. |  存放中央银行款项          |0003|              0.00|              0.00|  
  10. |----------------------------+----+------------------+------------------+  
  11. |  专项央行票据              |0004|              0.00|              0.00|  
  12. |----------------------------+----+------------------+------------------+  
  13. |  央行专项扶持资金          |0005|              0.00|              0.00|  
  14. |----------------------------+----+------------------+------------------+  
  15. |  存放同业款项              |0006|              0.00|              0.00|  
  16. |----------------------------+----+------------------+------------------+  
  17. |  存放联行款项              |0007|              0.00|              0.00|  
  18. |----------------------------+----+------------------+------------------+  
  19. |  拆放同业                  |0008|              0.00|              0.00|  
  20. |----------------------------+----+------------------+------------------+  
  21. |  拆放金融性公司            |0009|              0.00|              0.00|  
  22. |----------------------------+----+------------------+------------------+  
  23.                                                                            

实现:报表数据在数据库,可以用jdbc查询出来,最终要生成文件,不由想到使用freemarker,那还需要的就是画一个ftl模版。
针对最终的文件形式,ftl如下:
java 代码
 
  1.  %%${organization.number}  
  2. <#assign prepage=0>  
  3. <#assign pagenumber=30>  
  4. <#assign currentnumber=0>  
  5. <#assign currentpage=1>  
  6. <#list rows as row>  
  7. <#if (prerow?exists && prerow.curr_cd != row.curr_cd)>  
  8. <#assign currentpage = currentpage + 1>  
  9. <#assign currentnumber=0>  
  10.   +-----------------------------------------------------------------------------------------------------------------------------------------------+  
  11.        事后监督                         主管                            复核                         制表                    报表日期   ${date?string("yyyy/MM/dd")}  
  12. <!---->if>  
  13. <#if currentnumber % pagenumber == 0>                                                     @@ xx金融机构资产负债表 &&  
  14.    单位名称  ${organization.name}                           报表类型  日报         制表日期  ${date?string("yyyy")}   年  ${date?string("MM")}  月  ${date?string("dd")}  日        币种  ${row.curr_cd}  
  15.                                                                                                        单位: 元                第      ${currentpage}   页  
  16.   +-----------------------------------------------------------------------------------------------------------------------------------------------+  
  17.   |             资产           | 行 |  期初数          |  期末数          |             资产           | 行 |  期初数          |  期末数          |  
  18.   |                            | 次 |                  |                  |                            | 次 |                  |                  |  
  19. <!---->if>  
  20.   |----------------------------+----+------------------+------------------+----------------------------+----+------------------+------------------|  
  21.   |${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)}|  
  22. <#if (currentnumber % pagenumber == pagenumber - 1) || (row_has_next == false)>  
  23.   +-----------------------------------------------------------------------------------------------------------------------------------------------+  
  24.        事后监督                         主管                            复核                         制表                    报表日期   ${date?string("yyyy/MM/dd")}  
  25. <#assign currentpage = currentpage + 1><!---->if>  
  26. <#assign prerow = row>  
  27. <#assign prepage = currentpage>  
  28. <#assign currentnumber = currentnumber + 1>  
  29. <!---->  

生成文件的Main方法代码如下:
java 代码
 
  1. import java.io.BufferedWriter;  
  2. import java.io.File;  
  3. import java.io.FileWriter;  
  4. import java.io.IOException;  
  5. import java.sql.Connection;  
  6. import java.sql.Date;  
  7. import java.sql.DriverManager;  
  8. import java.sql.PreparedStatement;  
  9. import java.sql.ResultSet;  
  10. import java.text.SimpleDateFormat;  
  11. import java.util.ArrayList;  
  12. import java.util.HashMap;  
  13. import java.util.List;  
  14. import java.util.Map;  
  15.   
  16. import freemarker.template.Configuration;  
  17. import freemarker.template.DefaultObjectWrapper;  
  18. import freemarker.template.Template;  
  19.   
  20. /** 
  21.  * @author arthur 
  22.  * @version $Revision: 1.1 $ 
  23.  */  
  24.   
  25. public class Test {  
  26.   
  27.     public static void main(String[] args) throws Exception {  
  28.         Class.forName("com.ibm.db2.jcc.DB2Driver");  
  29.   
  30.         Connection conn = DriverManager.getConnection("jdbc:db2://ip:port/dbname""username""pwd");  
  31.   
  32.         StringBuffer sb = new StringBuffer(  
  33.                 "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 ");  
  34.         sb.append("where RECORD_DATE = ?");  
  35.         sb.append("order by cycle_no,BANK_NO,CURR_CD,line_no");  
  36.         PreparedStatement pstmt = conn.prepareStatement(sb.toString());  
  37.         Date date = Date.valueOf("2006-6-30");  
  38.         pstmt.setDate(1, date);  
  39.         ResultSet rs = pstmt.executeQuery();  
  40.         Map root = new HashMap();  
  41.         List rows = new ArrayList();  
  42.         Map org = new HashMap();  
  43.         int pre_cycle_no = -1;  
  44.         String pre_bank_no = "";  
  45.         while (rs.next()) {  
  46.             Map row = new HashMap();  
  47.             int cycle_no = rs.getInt("cycle_no");  
  48.             String bank_no = rs.getString("bank_no");  
  49.             if (pre_cycle_no != -1 && pre_cycle_no != cycle_no  
  50.                     || (pre_bank_no.length() > 0 && !pre_bank_no.equals(bank_no))) {// 另外一个cycle_no和bank_no  
  51.                 org.put("number", pre_bank_no);  
  52.                 org.put("name", pre_bank_no);  
  53.                 root.put("organization", org);  
  54.                 root.put("date", date);  
  55.                 root.put("rows", rows);  
  56.   
  57.                 Configuration cfg = new Configuration();  
  58.                 cfg.setDirectoryForTemplateLoading(new File("D:/work/template/"));  
  59.                 cfg.setObjectWrapper(new DefaultObjectWrapper());  
  60.                 Template temp = cfg.getTemplate("资产负债表.ftl");  
  61.                 String dateString = new SimpleDateFormat("yyyyMMdd").format(date);  
  62.                 String fileName = "T" + pre_bank_no + "_" + dateString + "_" + pre_cycle_no + pre_bank_no;  
  63.                 File file = new File("D:/work/dest/" + fileName);  
  64.                 FileWriter fw = new FileWriter(file);  
  65.                 try {  
  66.                     BufferedWriter bw = new BufferedWriter(fw);  
  67.                     temp.process(root, bw);  
  68.                     bw.flush();  
  69.                 } catch (IOException e) {  
  70.                     e.printStackTrace();  
  71.                 } finally {  
  72.                     fw.close();  
  73.                 }  
  74.                 rows = new ArrayList();  
  75.             }  
  76.             int line_no = rs.getInt("line_no");  
  77.             row.put("line_no"new Integer(line_no));  
  78.             row.put("item_name", rightPad(rs.getString("item_name"), 28));  
  79.             row.put("begin_bal", rs.getBigDecimal("begin_bal"));  
  80.             row.put("end_bal", rs.getBigDecimal("end_bal"));  
  81.             row.put("item_name2", rightPad(rs.getString("item_name2"), 28));  
  82.             row.put("begin_bal2", rs.getBigDecimal("begin_bal2"));  
  83.             row.put("end_bal2", rs.getBigDecimal("end_bal2"));  
  84.             row.put("curr_cd", rs.getString("curr_cd"));  
  85.   
  86.             rows.add(row);  
  87.   
  88.             root = new HashMap();  
  89.             pre_cycle_no = cycle_no;  
  90.             pre_bank_no = bank_no;  
  91.         }  
  92.   
  93.         rs.close();  
  94.         pstmt.close();  
  95.         conn.close();  
  96.   
  97.     }  
  98.   
  99.     /** 
  100.      * 汉字算2位的右边补齐空格方法 
  101.      */  
  102.     public static String rightPad(String s, int minLength) {  
  103.         int ln = length(s);  
  104.         if (minLength <= ln) {  
  105.             return s;  
  106.         }  
  107.   
  108.         StringBuffer res = new StringBuffer(minLength);  
  109.   
  110.         res.append(s);  
  111.   
  112.         int dif = minLength - ln;  
  113.         for (int i = 0; i < dif; i++) {  
  114.             res.append(' ');  
  115.         }  
  116.   
  117.         return res.toString();  
  118.     }  
  119.   
  120.     /** 
  121.      * 汉字算2位的左边补齐空格方法 
  122.      */  
  123.     public static String leftPad(String s, int minLength) {  
  124.         int ln = length(s);  
  125.         if (minLength <= ln) {  
  126.             return s;  
  127.         }  
  128.   
  129.         StringBuffer res = new StringBuffer(minLength);  
  130.   
  131.         int dif = minLength - ln;  
  132.         for (int i = 0; i < dif; i++) {  
  133.             res.append(' ');  
  134.         }  
  135.   
  136.         res.append(s);  
  137.   
  138.         return res.toString();  
  139.     }  
  140.   
  141.     /** 
  142.      * 汉字算2位的String length计算方法 
  143.      */  
  144.     public static int length(String s) {  
  145.         int counter = 0;  
  146.         for (int i = 0; i < s.length(); i++) {  
  147.             char c = s.charAt(i);  
  148.             if (c < 255) {  
  149.                 counter++;  
  150.             } else {  
  151.                 counter = counter + 2;  
  152.             }  
  153.         }  
  154.         return counter;  
  155.     }  
  156. }  

这个代码很不完善,比如没有异常捕获、Log机制、目标目录和用到的模版文件都是写死,仅仅作为测试使用。
分享到:
评论

相关推荐

    利用FreeMarker生成word文件例子

    在Java开发中,利用FreeMarker生成Word文件可以极大地提高效率,尤其在需要批量生成或者自定义模板的情况下。以下是对这个主题的详细阐述: ### FreeMarker简介 FreeMarker是一个开源的、基于模板的Java库,它将...

    使用Java-freemarker生成word文档.doc

    总结来说,通过Java-Freemarker生成Word文档的关键步骤包括:创建Word模板、转换为XML、编辑XML模板,以及使用Freemarker的模板引擎将数据注入XML模板生成最终的Word文档。这个过程大大简化了动态生成Word文档的复杂...

    SpringBoot+JPA+Freemarker 生成动态SQL

    结合SpringBoot和JPA,我们可以创建一个服务,该服务使用JPA的Repository接口与数据库进行交互,并通过Freemarker生成动态SQL。具体步骤如下: 1. **设置项目**:创建一个SpringBoot项目,添加Spring Data JPA和...

    freemarker导出doc及docx

    你需要在这里定义数据模型,加载Freemarker模板,设置输出文件路径,然后调用Freemarker的API来生成文档。具体步骤如下: - 创建一个`Configuration`对象,配置Freemarker的模板目录。 - 加载Freemarker模板文件,...

    Springboot+freemarker生成word

    最后,运行`WordUtil`类中的`main`函数,调用`WordService.generateWord()`方法,传入必要的参数,就可以生成包含图片的Word文档了。 这个项目为我们提供了一个实用的工具,可以方便地根据模板生成动态的Word文档,...

    freemarker Demo 适用于freemarker初学

    这个"freemarker Demo"项目应该包含了基本的模板文件、Struts2配置以及相关的Java代码,通过实际运行和修改这些文件,初学者可以更好地理解Freemarker的工作原理和使用方法。在学习过程中,可以逐步尝试不同的表达式...

    一个意义深刻 FreeMarker 入门例子之HelloWord

    - 主类:通常包含`main`方法,是程序的入口点,负责初始化FreeMarker环境,读取数据,调用FreeMarker模板进行渲染。 - 配置文件:可能包含`freemarker.properties`或`application.properties`等,用于设置...

    Java通过模版生成word文档

    使用FreeMarker生成Word文档,首先需要准备一个`.ftl`模板文件,定义好文档的结构和占位符,然后在Java代码中解析模板并替换占位符为实际数据。 三、生成Word文档步骤 1. 添加依赖:在项目中引入FreeMarker和用于...

    freemarker学习

    Freemarker是一个强大的模板引擎,主要用于生成文本输出,尤其在HTML Web页面的生成上非常有用。它是用Java编写的,并且常被用作MVC模式应用程序的一部分,而非完整的Web应用框架。Freemarker的核心思想是将数据模型...

    springmvc+freemarker带sql的登录事例

    FreeMarker则是一种模板引擎,用于生成动态HTML或其他格式的文本输出。 首先,我们需要设置项目结构。一个标准的Spring MVC项目通常包含以下几个主要部分:`src/main/java`、`src/main/resources`、`src/main/...

    自动生成代码

    代码生成过程中,可能使用到了模板引擎,这里提到了`freemarker-2.3.19.jar`,这是一个强大的Java模板引擎,用于动态生成文本输出,如HTML页面、XML文档或者Java源代码。 Freemarker模板语言允许开发者定义一套规则...

    利用freemarker导出word 小例子方便新手学习

    - FreeMarker是一个基于模板的生成器,主要用在Web应用中生成动态内容,但也可用于生成任何类型的文本输出,包括Word文档。 - 它的工作原理是:模板文件(.ftl)包含静态文本和变量,变量由Java对象的值填充。 - ...

    第一个FreeMarker HelloWorld程序

    实际上,FreeMarker支持更复杂的逻辑操作,如条件判断(`&lt;#if&gt;`)、循环(`&lt;#foreach&gt;`)、函数调用等,能够满足各种动态生成文本的需求。 通过阅读这篇博客文章(https://wildwolfjack.iteye.com/blog/591048),...

    FreeMarker 使用

    在这个例子中,`hello` 方法返回的 "hello" 就是 FreeMarker 模板的名称,Spring 会自动查找对应的 `hello.ftl` 文件。 ### 5. 运行与测试 完成上述配置后,启动 Spring 应用,访问 `http://localhost:8080/hello`...

    JAVA根据模板生成WORD文件相关材料

    下面是一个简单的Java代码片段,展示了如何使用Apache POI和FreeMarker生成Word文件: ```java import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template....

    SpringMVC+freemarker

    - `src/main/resources/templates` 目录下应该存放 Freemarker 模板文件,如 `index.ftl`,其中可以见到自定义标签的使用。 - `src/main/java` 目录下的 Controller 类可能包含处理请求和返回数据的方法,如 `...

    Spring 3 mvc + Freemarker 框架例子

    当用户访问`/hello`路径时,Spring MVC会调用`HelloController`中的`hello`方法,该方法将“你好,Spring MVC + Freemarker!”消息放入模型数据中,并指定视图为`hello.ftl`。Freemarker模板引擎随后会根据这个视图...

    Java项目Freemark生成静态页面及语法

    在本教程中,我们将深入探讨如何在Java项目中使用Freemarker生成静态页面,以及其基本语法。 首先,了解Freemarker的基本概念是必要的。它是一个模板语言,允许开发者用简单的标记来控制输出内容。Freemarker与后端...

Global site tag (gtag.js) - Google Analytics