java读取带格式word⽂档_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⽂档
主要程序如下:
/**
* 将制定的字符串转换为rtf编码
*/
public String bin2hex(String bin) {
char[] digital = "0123456789ABCDEF".toCharArray();
StringBuffer sb = new StringBuffer("");
byte[] bs = Bytes();
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]);
}
String();
}
/**
* 字节形式读取rtf模板内容
*/
public String readByteRtf(InputStream ins, String path){
String sourcecontent = "";
try{
ins = new FileInputStream(path);
byte[] b = new byte[1024];
if (ins == null) {
System.out.println("源模板⽂件不存在");
}
int bytesRead = 0;
while (true) {
bytesRead = ad(b, 0, 1024); // return final read bytes counts
if(bytesRead == -1) {// end of InputStream
System.out.println("读取模板⽂件结束");
break;
}
sourcecontent += new String(b, 0, bytesRead); // convert to string using bytes
}
}catch(Exception e){
e.printStackTrace();
}
}
以上为核⼼代码,剩余部分就是替换,从新组装java中的place(oldstr,newstr);⽅法可以实现,在这就不贴了。源代码部分详见附件。运⾏源代码前提:
c盘创建YQ⽬录,将附件中"模板.rtf"复制到YQ⽬录之下,运⾏OpreatorRTF.java⽂件即可,就会在YQ⽬录下⽣成⽂件名如:21时15分19秒_cheney_记录.rtf 的⽂件。。。。。⽂件名是在程序中指定的呵
呵。由于是由商业软件中拆分出的demo所以只是将⾃⼰原来的写的程序分离,合并在⼀个java⽂件中,所以有的⽅法在⽰例程序中看似多余,没有必要那么⿇烦。
对于替换部分需要循环的特例程序,我不好拆分,⾥⾯很容易暴露商业软件的东西,所以就不贴了,有需要的话可以加我QQ或者MSN,⼀起讨论呵呵。附件传了半天也没有传上去,没有办法只有这样搞了呵呵。模板⽂件附件⽆法存放,需要的直接联系呵呵。其实直接看以下的java程序部分,就会明⽩
/**
* 以下部分是java源代码
*/
package com;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
SimpleDateFormat;
import java.util.Date;java replace方法
public class OperatorRTF {
/**
* 字符串转换为rtf编码
* @param content
* @return
*/
public String strToRtf(String content){
char[] digital = "0123456789ABCDEF".toCharArray();
StringBuffer sb = new StringBuffer("");
byte[] bs = Bytes();
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]);
}
String();
}
/**
* 替换⽂档的可变部分
* @param content
* @param replacecontent
* @param flag
* @return
*/
public String replaceRTF(String content,String replacecontent,int flag){ String rc = strToRtf(replacecontent);
String target = "";
/*if(flag==0){
target = place("$time$",rc);
}*/
if(flag==0){
target = place("$timetop$",rc); }
if(flag==1){
target = place("$info$",rc);
}
if(flag==2){
target = place("$idea$",rc);
}
if(flag==3){
target = place("$advice$",rc);
}
if(flag==4){
target = place("$infosend$",rc); }
return target;
}
/**
* 获取⽂件路径
* @param flag
* @return
*/
public String getSavePath() {
String path = "C:\\YQ";
File fDirecotry = new File(path);
if (!ists()) {
fDirecotry.mkdirs();
}
return path;
}
/**
* 半⾓转为全⾓
*/
public String ToSBC(String input){
char[] c = CharArray();
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) {
// TODO Auto-generated method stub
/*  构建⽣成⽂件名 targetname:12时10分23秒_username_记录.rtf */
Date current=new Date();
SimpleDateFormat sdf=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 +"_记录.rtf";
/* 字节形式读取模板⽂件内容,将结果转为字符串 */
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;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。