计行好像还在处于研发阶段,不太稳定,做项目不太敢用);java2Word、jacob容易报错找不到注册,比较诡异,我曾经在不同的机器上试过, *** 作
方法完全一致,有的机器不报错,有的报错,去他们论坛找高人解决也说不出原因,项目部署用它有点玄;itxt好像写很方便但是我查了好久资料没有见到过关
于读的好办法。经过一番选择还是折中点采用rtf最好,毕竟rtf是开源格式,不需要借助任何插件,只需基本IO *** 作外加编码转换即可。rtf格式文件表
面看来和doc没啥区别,都可以用word打开,各种格式都可以设定。
----- 实现的功能:读取rtf模板内容(格式和文本内容),替换变化部分,形成新的rtf文档。
----- 实现思路:模如源伍板中固定部分手动输入,变化的部分用$info$表示,只需替换$info$即可。
1、采用字节的形式读取rtf模板内容
2、将可变的内容字符串转为rtf编码
3、替换原文中的可变部分,形成新的rtf文档
主要程序如下:
public String bin2hex(String bin) {
char[] digital = "0123456789ABCDEF".toCharArray()
StringBuffer sb = new StringBuffer("")
byte[] bs = bin.getBytes()
int bit
for (int i = 0i <bs.lengthi++) {
bit = (bs[i] &0x0f0)
>>4
sb.append("\\'")
sb.append(digital[bit])
bit = bs[i] &0x0f
sb.append(digital[bit])
}
return sb.toString()
}
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 = ins.read(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()
}
return sourcecontent
}
以上为核心代码,剩余部分就是替换,从新组装java中的String.replace(oldstr,newstr)方法可以实现,在这就不贴了。源代码部分详见附件。
运行源代码前提:
c盘创建YQ目录,将附件中"模板.rtf"复制到YQ目录之下,运行OpreatorRTF.java文件即可,就会在YQ目录下渣或生成文件名如:21时15分19秒_cheney_记录.rtf
的文件。
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
import java.text.SimpleDateFormat
import java.util.Date
public class OperatorRTF {
public String strToRtf(String content){
char[] digital = "0123456789ABCDEF".toCharArray()
StringBuffer sb = new StringBuffer("")
byte[] bs = content.getBytes()
int bit
for (int i = 0i <bs.lengthi++) {
bit = (bs[i] &0x0f0)
>>4
sb.append("\\'")
sb.append(digital[bit])
bit = bs[i] &0x0f
sb.append(digital[bit])
}
return sb.toString()
}
public String replaceRTF(String content,String replacecontent,int
flag){
String rc = strToRtf(replacecontent)
String target = ""
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
}
public String getSavePath() {
String path = "C:\\YQ"
File fDirecotry = new File(path)
if (!fDirecotry.exists()) {
fDirecotry.mkdirs()
}
return path
}
public String ToSBC(String input){
char[] c =
input.toCharArray()
for (int i =
0i <c.lengthi++){
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
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 +"_记录.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
while (true) {
bytesRead = ins.read(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()
}
String targetcontent = ""
String array[] = content.split("~")
for(int i=0i<array.lengthi++){
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)
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) {
// TODO Auto-generated method stub
OperatorRTF oRTF = new OperatorRTF()
String content =
"2008年10月12日9时-2008年10月12日6时~我们参照检验药品的方法~我们参照检验药品的方法~我们参照检验药品的方法~我们参照检验药品的方法"
oRTF.rgModel("cheney",content)
}
}
word有微软的专用格式,裂碧如果要读取其内容,可以使用jar包,如下:1。用jacob.
其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者肆斗举一并提供了。
jacob下载: http://www.matrix.org.cn/down_view.asp?id=13
下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个例子:
import java.io.File
import com.jacob.com.*
import com.jacob.activeX.*
public class FileExtracter{
public static void main(String[] args) {
ActiveXComponent app = new ActiveXComponent("Word.Application")
String inFile = "c:\\test.doc"
String tpFile = "c:\\temp.htm"
String otFile = "c:\\temp.xml"
boolean flag = false
try {
app.setProperty("Visible", new Variant(false))
Object docs = app.getProperty("销携Documents").toDispatch()
Object doc = Dispatch.invoke(docs,"Open", Dispatch.Method, new Object[]{inFile,new Variant(false), new Variant(true)}, new int[1]).toDispatch()
Dispatch.invoke(doc,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1])
Variant f = new Variant(false)
Dispatch.call(doc, "Close", f)
flag = true
} catch (Exception e) {
e.printStackTrace()
} finally {
app.invoke("Quit", new Variant[] {})
}
}
}
2。用apache的poi来抽取word,excel。
poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你:
下载经过封装后的poi包: http://www.matrix.org.cn/down_view.asp?id=14
下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子:
import java.io.*
import org.textmining.text.extraction.WordExtractor
/**
*
Title: pdf extraction
*
Description: email:chris@matrix.org.cn
*
Copyright: Matrix Copyright (c) 2003
*
Company: Matrix.org.cn
* @author chris
* @version 1.0,who use this example pls remain the declare
*/
public class PdfExtractor {
public PdfExtractor() {
}
public static void main(String args[]) throws Exception
{
FileInputStream in = new FileInputStream ("c:\\a.doc")
WordExtractor extractor = new WordExtractor()
String str = extractor.extractText(in)
System.out.println("the result length is"+str.length())
System.out.println("the result is"+str)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)