0 0

java根据模板修改内容后,生成word,修改后内容中文乱码 15

Java code
package com.sunyard.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class OperatorRTF {

    /**
     * 字符串转换为rtf编码
     *
     * @param content
     * @return
     */
    public String strToRtf(String content) {

        try {
            System.out.println(content);
            content=new String(content.getBytes(),"GB2312");
            System.out.println(content);
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        char[] digital = "0123456789ABCDEF".toCharArray();
        StringBuffer sb = new StringBuffer("");
        byte[] bs = null;
        bs = content.getBytes();
        int bit;
        for (int i = 0; i < bs.length; i++) {
            bit = (bs[i] & 0x0f0) >> 4;
            sb.append("\\'");
            sb.append(digital[bit]);
            bit = bs[i] & 0x0f;
            sb.append(digital[bit]);
        }
        return sb.toString();
    }

    /**
     * 替换文档的可变部分
     *
     * @param content
     * @param replacecontent
     * @param flag
     * @return
     */
    public String replaceRTF(String content, String replacecontent, int flag) {
        String rc = strToRtf(replacecontent);
        String target = "";
        System.out.println(rc);
        if (flag == 0) {
            target = content.replace("$timetop$", rc);
        }
        if (flag == 1) {
            target = content.replace("$info$", rc);
        }
        if (flag == 2) {
            target = content.replace("$idea$", rc);
        }
        if (flag == 3) {
            target = content.replace("$advice$", rc);
        }
        if (flag == 4) {
            target = content.replace("$infosend$", rc);
        }
        return target;
    }

    /**
     * 获取文件路径
     *
     * @param flag
     * @return
     */
    public String getSavePath() {

        String path = "D:\\";
        File fDirecotry = new File(path);
        if (!fDirecotry.exists()) {
            fDirecotry.mkdirs();
        }
        return path;
    }

    /**
     * 半角转为全角
     */
    public String ToSBC(String input) {
        char[] c = input.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if (c[i] == 32) {
                c[i] = (char) 12288;
                continue;
            }
            if (c[i] < 127) {
                c[i] = (char) (c[i] + 65248);
            }
        }
        return new String(c);
    }

    public void rgModel(String username, String content) {
        /* 构建生成文件名 targetname:12时10分23秒_username_记录.rtf */
        Date current = new Date();

        SimpleDateFormat sdf = new java.text.SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss");

        String targetname = sdf.format(current).substring(11, 13) + "时";
        targetname += sdf.format(current).substring(14, 16) + "分";
        targetname += sdf.format(current).substring(17, 19) + "秒";
        targetname += "_" + username + "_记录.doc";
       
        /* 字节形式读取模板文件内容,将结果转为字符串 */
        String strpath = getSavePath();
        String sourname = strpath + "\\" + "档案利用登记单.rtf";
        String sourcecontent = "";
        InputStream ins = null;
        try {
            ins = new FileInputStream(sourname);
            byte[] b = new byte[1024];
            if (ins == null) {
                System.out.println("源模板文件不存在");
            }
            int bytesRead = 0;
            while (true) {
                bytesRead = ins.read(b, 0, 1024); // return final read bytes
                // counts
                if (bytesRead == -1) {// end of InputStream
                    System.out.println("读取模板文件结束");
                    break;
                }
                // convert to string using bytes
                sourcecontent += new String(b, 0, bytesRead);
               
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
       
        /* 修改变化部分 */
        String targetcontent = "";
        /**
         * 拆分之后的数组元素与模板中的标识符对应关系 array[0]:timetop array[1]:info array[2]:idea
         * array[3]:advice array[4]:infosend
         */
        String array[] = content.split("~");

        // 2008年11月27日:更新模板之后时间无需自动填充
        for (int i = 0; i < array.length; i++) {
            if (i == 0) {
                targetcontent = replaceRTF(sourcecontent, array[i], i);
            } else {
                targetcontent = replaceRTF(targetcontent, array[i], i);
            }
        }
        /* 结果输出保存到文件 */
        try {
            FileWriter fw = new FileWriter(getSavePath() + "\\" + targetname,
                    true);
            PrintWriter out = new PrintWriter(fw);
            System.out.println(targetcontent);
            if (targetcontent.equals("") || targetcontent == "") {
                out.println(sourcecontent);
            } else {
                out.println(targetcontent);
            }
            out.close();
            fw.close();
            System.out.println(getSavePath() + "  该目录下生成文件" + targetname
                    + " 成功");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {

        OperatorRTF oRTF = new OperatorRTF();

        // 被替换内容以"~"符号分割,处理的时候将其拆分为数组即可
        String content = "2008Y10M12D9H-2008Y10M12D6H~idea~look~我们参照检验药品的方法~we";
        oRTF.rgModel("cheney", content);
    }
}




上面的代码是我在网上找到的一种java操作word的方法

java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用);java2Word、jacob容易报错找不到注册,比较诡异,我曾经在不同的机器上试过,操作方法完全一致,有的机器不报错,有的报错,去他们论坛找高人解决也说不出原因,项目部署用它有点玄;itxt好像写很方便但是我查了好久资料没有见到过关于读的好办法。经过一番选择还是折中点采用rtf最好,毕竟rtf是开源格式,不需要借助任何插件,只需基本IO操作外加编码转换即可。rtf格式文件表面看来和doc没啥区别,都可以用word打开,各种格式都可以设定。

----- 实现的功能:读取rtf模板内容(格式和文本内容),替换变化部分,形成新的rtf文档。



----- 实现思路:模板中固定部分手动输入,变化的部分用$info$表示,只需替换$info$即可。

      1、采用字节的形式读取rtf模板内容

      2、将可变的内容字符串转为rtf编码

      3、替换原文中的可变部分,形成新的rtf文档

这是原作者的想法,可我在使用过程中,发现替换内容中(我们参照检验药品的方法)这个中文,是不能显示的,在word里,把它转换成了iso-8859-1的编码了,不能正常显示中文,我都不知道应该在哪设置编码,才能让它正常显示,原word模板中的中文,可以正常显示,应该是在读取word模板的时候,把编码方式也读进去了,现在就是想请教一下前辈们,应该如何后,自己修改的那些中文,也可以正常显示呢
问题补充:
汗,这里好象自己不能回复,所以我以这种形式回复。
先感谢一楼,二楼的回答,昨天我有事,请假没上班,所以没能及时回复,先道个歉。
先回答1楼的,在写的时候,我设置编码的话,感觉是无效的,不管我怎么设置,都没用。
再回答2楼的,特别说一下,我试了一下,发现生成的word里,那些修改部分的中文的编码形式改变了,只是还是乱码。后来我把unicode,ISO-8859-1,UTF-8,GB2312,GBK,甚至ASCII都试过了, word里都是不同形式的乱码,就是不出现汉字,真闷,我感觉是在
bs = content.getBytes("unicode");
后,系统后来又默认的把这把转成了ISO-8859-1的形式.
可是
bs = content.getBytes("ISO-8859-1");
我这么设置,word里的汉字是?????
真不知道为什么,要是ISO-8859-1,转ISO-8859-1,应该不会改变的哎
希望高手们,能继续解答,谢谢

问题补充:
汪兆铭,您好,我不知道您一直观注这个问题,我以为要过会才能看到您的回答,所以,现在才刷新了这个页面,不好意思,先道个歉。

现在回到问题中,我照您的意思,
bs = content.getBytes("unicode");
改了一下,然后输入,可是依然不能正常显示中文,是不是,在哪,还需要再转换一次呢?
问题补充:
mirzlm@126.com
谢谢,不知道与jdk版本或是什么的没有关系
问题补充:
汪兆铭,您好,我看了一下您发的东西,我发现了问题的所在,竟然是在表格单元格里面的,就替换出来的是乱码,在表格单元格外面的,是可以正常显示的,您可以去试试,把替换的那个,放在表格里,看看,会不会成功,谢谢你的帮助
问题补充:
谢谢您,给我这么多的帮助,那应该是我的那个rtf模板的问题了,真的很感谢,谢谢,谢谢,再谢谢
2009年4月14日 16:05

7个答案 按时间排序 按投票排序

0 0

采纳的答案

strToRtf方法中的这句
bs = content.getBytes();
换成

bs = content.getBytes("unicode");

这句

2009年4月14日 21:21
0 0

表格里的也没乱码

已发给你了

2009年4月16日 13:50
0 0

已发,请查收。

2009年4月16日 13:22
0 0

我测试了OperatorRTF 类,
没有乱码

给个邮箱,我发给你。

2009年4月16日 13:04
0 0

你的程序里的

bit = (bs[i] & 0x0f0) >> 4;
            sb.append("\\'");
            sb.append(digital[bit]);
            bit = bs[i] & 0x0f;
            sb.append(digital[bit]);

就是处理这个编码的。所以这里转byte[]前,要unicode下。

2009年4月16日 11:09
0 0

新建一个文本文件,输入一些字符,包括英文和中文。
然后用写字板打开。另存为rtf文件。

再用记事本打开这个rtf文件。

可以看到rtf文件实际也是一个文本文件。
头部定义了样式表。
后面是正文。用\pvar标识段落。
中文和oxff以外的字符都用\'xx\'xx标识,其中xxxx是16进制的unicode编码。

2009年4月16日 11:08
0 0

在读和写的文件流中设置编码看看

2009年4月14日 17:53

相关推荐

    根据RTF模板生成WORD,WORD转PDF

    本主题主要涉及两个关键步骤:根据RTF(Rich Text Format)模板生成Word文档,然后将生成的Word文档转换为PDF格式。让我们详细探讨这两个过程以及解决乱码和转换失败的问题。 **RTF模板生成Word文档** RTF是一种...

    Java freemarker生成word文件

    - 使用FreeMarker的`Configuration`对象加载模板文件,然后使用`Template`对象结合数据模型生成Word文档: ```java Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg....

    java生成word文件并下载.pdf

    3. **生成Word文件**:通过`BufferedWriter`和`OutputStreamWriter`组合创建一个输出流,用于将模板和数据模型合并后的内容写入到新的Word文件中。`process`方法用于将模板和数据集合并生成文件。 4. **文件下载**...

    生成WORD freemarker导出WORD

    通过Java代码,我们可以将业务数据绑定到这些模板上,FreeMarker引擎会自动处理模板和数据的合并,生成Word文档。 使用UTF-8编码是该项目的一个关键点。在处理中文字符时,确保文件编码正确至关重要,否则可能会...

    java开发word模板填充转PDF文件

    1.此项目为word打印报表实现的核心方法。 2.使用poi填充word报表标签及表格数据技术,解决标签替换...3.使用jacob操作com组件技术将word转为PDF文件,解决转换后部分中文丢失、乱码、表格丢失、转换后失真等常见问题。

    jacob通过word模板生成word文档

    java项目, 直接导入eclipse里面或者myeclipse里面就可以运行....通过jacob插件,通过word模板自动填充相应的数据,并且产生文件,为了解决有的tomcat下会乱码, 生成完成之后会转码一下, 解决了中文乱码问题.

    aspose生成word、转pdf的java工具类

    2. **Java生成Word**:Aspose.Words for Java是Aspose库的一部分,它允许开发者通过编程方式创建、修改和操作Microsoft Word文档。你可以创建新的文档,插入文本、图片、表格,应用样式,执行复杂的排版任务,以及...

    ItextpdfboxPDFword生成和读取各种例子最详细的打包

    在这个压缩包中,你可能会找到一系列示例代码,展示了如何使用这两个库进行各种操作,包括读取PDF、解析PDF、生成PDF、生成Word文件以及解决中文乱码问题。 首先,让我们详细了解一下IText库。IText是一个开源的...

    freemarker生成doc方案.pdf(内附代码下载地址)

    相比于Apache POI,Freemarker生成Word文档的方案更受欢迎,主要是因为Freemarker不需要用代码调整样式,可以直接使用Microsoft Office导出的XML文件作为模板,然后在模板中使用Freemarker标签替换动态内容。...

    Java用freemarker导出word例子

    FTL文件通常包含HTML、XML或其他文本格式,但在这里我们将重点讨论如何生成Word文档。 首先,理解`Freemarker`的基本语法至关重要。FTL文件中的主要元素有变量(`${...}`)、控制结构(如`&lt;#if&gt;`、`&lt;#foreach&gt;`)和...

    Java实现Web报表打印功能.

    值得注意的是,当处理包含中文的内容时,需额外引入支持亚洲字体的iTextAsian.jar文件,避免乱码问题。 #### 报表打印实现策略 ##### 直接编程生成PDF文档 通过直接编程方式,可以利用iTextAPI构建PDF文档。示例...

    Freemarker 学习笔记一 【乱码解决】

    Freemarker是一个强大的Java模板引擎,常用于动态生成HTML或其他类型的文档。在使用Freemarker的过程中,遇到乱码问题是一个常见的挑战,特别是当处理不同编码格式的数据时。本篇文章将探讨如何解决Freemarker中的...

    用freemarker导出word

    Freemarker导出Word文档的原理是,首先创建一个包含Word文档结构的模板文件,然后将这个模板与Java对象中的数据模型结合,最后通过API生成Word文档。这个过程通常涉及两个步骤:解析模板和合并数据。 三、模板设计 ...

    FreemarkerWord.rar

    在生成Word文档时,保持文件的UTF-8编码可以避免字符乱码问题,保证内容的可读性。 在压缩包内的“WordText”可能是一个或者多个示例模板文件,或者是用于测试导出功能的文本文件。开发者可以查看这些文件,了解...

    easypoi 模板导出图片不显示,循环指令中合并单元格格式错乱问题解决

    (1)模板导出图片不显示(实际上导出来了只是最小化显示了) (2)fe循环指令存在而合并单元格的时候格式错乱问题 (3)fe存在一对多关系的时候格式错乱问题 不想下载的可以参考博文 ,代码是一样的 ...

    word__xls文件导出

    虽然上述示例中没有展示具体的文件内容生成代码,但在实际应用中,我们可能需要在JSP页面中动态生成word或xls文件的内容。这可以通过读取数据库数据,使用模板引擎(如Freemarker、Thymeleaf等)生成HTML,再转换为...

    apache-freemarker-2.3.27-incubating-bin.tar.gz

    在描述中提到的“生成的word内容中有&等特殊字符也不需要转义处理”,这指的是FreeMarker引擎在处理模板时,能够自动处理特殊字符,避免了在生成Word文档时出现乱码或解析错误的问题。 FreeMarker的核心概念包括: ...

    itext相关jar包

    通过这个扩展,IText能够将内容导出为RTF格式,这使得Java应用可以轻松地与Microsoft Word等软件进行数据交互,比如生成Word文档。 在Java中实现Word文档导出,IText是一个强大的工具。通过使用这个库,开发者可以...

Global site tag (gtag.js) - Google Analytics