word文檔java
Ⅰ 怎樣才能把word文件讀取並顯示在java中請各位指教!
java讀取word文檔時,雖然網上介紹了很多插件poi、java2Word、jacob、itext等等,poi無法讀取格式(新的API估計行好像還在處於研發階段,不太穩定,做項目不太敢用);java2Word、jacob容易報錯找不到注冊,比較詭異,我曾經在不同的機器上試過,操作方法完全一致,有的機器不報錯,有的報錯,去他們論壇找高人解決也說不出原因,項目部署用它有點玄;itxt好像寫很方便但是我查了好久資料沒有見到過關於讀的好法。經過一番選擇還是折中點採用rtf最好,畢竟rtf是開源格式,不需要藉助任何插件,只需基本IO操作外加編碼轉換即可。rtf格式文件表面看來和doc沒啥區別,都可以用word打開,各種格式都可以設定。具體代碼可以參考:/blog/468943
Ⅱ 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文檔
主要程序如下:
public String bin2hex(String bin) {
char[] digital = "0123456789ABCDEF".toCharArray();
StringBuffer sb = new StringBuffer("");
byte[] bs = bin.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();
}
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 = 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();
}
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 =
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
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=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);
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);
}
}
Ⅲ JAVA如何修改Word文檔格式
如果只是文字的話,直接讀出來,然後用07的存回去,poi能實現。但是有目錄什麼的就麻煩了,03的讀出來目錄是一行代碼,就容易出問題
我用的poi正好在糾結,最後沒辦法,用按鍵精靈一個個轉的。有個word文檔批處理軟體貌似能做到,但是要收費。
下面的是我讀取word文字的代碼
03讀取:
InputStream is = new FileInputStream(docfile);
WordExtractor ex = new WordExtractor(is);
text = ex.getText();
System.out.println(text);
07讀取:
OPCPackage opcPackage = POIXMLDocument.openPackage(docxfile.getAbsolutePath());
POIXMLTextExtractor extractor = new XWPFWordExtractor(opcPackage);
text = extractor.getText();
System.out.println(text);
最後:doc不一定是03的,也可能是07的
Ⅳ java操作word 的有哪幾種方式
在Java平台操作Word文檔,ApachePOI, Apose.Words, Spire.Doc都是不錯的選擇,Spire.Doc有大量的中文教程,使用起來相對方便。
示例教程如:網頁鏈接
Ⅳ 用java打開一個word文檔(a.docx) 怎麼搞
package cn.rain.main;
import java.io.File;
import java.io.IOException;
public class TT {
/**
* @param args
*/
public static void main(String[] args) {
try {
Runtime.getRuntime().exec("C:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE aa.doc");
} catch (IOException e) {
// TODO 自動生成 catch 塊
e.printStackTrace();
}
}
}
你的WORD安裝路徑C:\\Program Files\\Microsoft Office\\OFFICE11\\WINWORD.EXE空格後所加的aa.doc為你的文檔文件名(有文件名重復的,專可以加屬路徑,寫法和安裝路徑的寫法一樣)
或者用Runtime.getRuntime().exec("cmd /c \"C:\\temp\\the list.doc\"");
也可以運行
Ⅵ 用java在線編輯word文檔
java本身沒有處理word的類庫,要處理word需要用第三方的類庫,就像處理execl一樣。專
http://wenku..com/view/3be2214f767f5acfa1c7cdf0.html,自己看屬說明學習一下吧。
Ⅶ 用java代碼把內容寫到Word文檔
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Test {
public static void main(String[] args) {
try
{
FileInputStream fr=new FileInputStream("test/123.txt");
InputStreamReader af=new InputStreamReader(fr);
BufferedReader bf=new BufferedReader(af);
FileOutputStream fo=new FileOutputStream("test/456.doc");
OutputStreamWriter osw=new OutputStreamWriter(fo);
BufferedWriter bw=new BufferedWriter(osw);
String line=bf.readLine();
while(line!=null)
{
System.out.println(line);
bw.write(line);
bw.newLine();
bw.flush();
line=bf.readLine();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
test/123.txt里的內容寫到test/456.doc下了,在你的 src中建一個test文件夾,這里是相對路徑
Ⅷ java如何根據word模板生成word文檔
先下載jacob_1.10.1.zip。
解壓後將jacob.dll放到windows/system32下面或\j2sdk\bin下面。
將jacob.jar加入項目。
/*
* Java2word.java
*
* Created on 2007年8月13日, 上午10:32
*
* To
change this template, choose Tools | Template Manager
* and open the template
in the editor.
*/
/*
* 傳入數據為HashMap對象,對象中的Key代表word模板中要替換的欄位,Value代表用來替換的值。
*
word模板中所有要替換的欄位(即HashMap中的Key)以特殊字元開頭和結尾,如:$code$、$date$……,
以免執行錯誤的替換。
*
所有要替換為圖片的欄位,Key中需包含image或者Value為圖片的全路徑(目前只判斷文件後綴名為:.bmp、
.jpg、.gif)。
*
要替換表格中的數據時,HashMap中的Key格式為「table$R@N」,其中:R代表從表格的第R行開始替換,N代表
word模板中的第N張表格;Value為ArrayList對象,ArrayList中包含的對象統一為String[],一條String[]代
表一行數據,ArrayList中第一條記錄為特殊記錄,記錄的是表格中要替換的列號,如:要替換第一列、第三列、
第五列的數據,則第一條記錄為String[3]
{「1」,」3」,」5」}。
*/
package com.word.util;
/**
*
* @author kdl
*/
import java.util.ArrayList;
import
java.util.HashMap;
import java.util.Iterator;
import com.jacob.activeX.ActiveXComponent;
import
com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class Java2word {
private boolean saveOnExit;
/**
* word文檔
*/
Dispatch doc = null;
/**
* word運行程序對象s
*/
private ActiveXComponent
word;
/**
* 所有word文檔
*/
private Dispatch
documents;
/**
* 構造函數
*/
public Java2word() {
if(word==null){
word = new
ActiveXComponent("Word.Application");
word.setProperty("Visible",new
Variant(false));
}
if(documents==null)
documents = word.getProperty("Documents").toDispatch();
saveOnExit =
false;
}
/**
* 設置參數:退出時是否保存
* @param
saveOnExit boolean true-退出時保存文件,false-退出時不保存文件
*/
public void
setSaveOnExit(boolean saveOnExit) {
this.saveOnExit =
saveOnExit;
}
/**
* 得到參數:退出時是否保存
* @return
boolean true-退出時保存文件,false-退出時不保存文件
*/
public boolean
getSaveOnExit() {
return saveOnExit;
}
/**
* 打開文件
* @param inputDoc String 要打開的文件,全路徑
*
@return Dispatch 打開的文件
*/
public Dispatch open(String inputDoc)
{
return
Dispatch.call(documents,"Open",inputDoc).toDispatch();
//return
Dispatch.invoke(documents,"Open",Dispatch.Method,new Object[]{inputDoc},new
int[1]).toDispatch();
}
/**
* 選定內容
*
@return Dispatch 選定的范圍或插入點
*/
public Dispatch select()
{
return word.getProperty("Selection").toDispatch();
}
/**
* 把選定內容或插入點向上移動
* @param selection
Dispatch 要移動的內容
* @param count int 移動的距離
*/
public
void moveUp(Dispatch selection,int count) {
for(int i = 0;i <
count;i ++)
Dispatch.call(selection,"MoveUp");
}
/**
* 把選定內容或插入點向下移動
* @param selection
Dispatch 要移動的內容
* @param count int 移動的距離
*/
public
void moveDown(Dispatch selection,int count) {
for(int i = 0;i <
count;i ++)
Dispatch.call(selection,"MoveDown");
}
/**
* 把選定內容或插入點向左移動
* @param selection
Dispatch 要移動的內容
* @param count int 移動的距離
*/
public
void moveLeft(Dispatch selection,int count) {
for(int i = 0;i <
count;i ++) {
Dispatch.call(selection,"MoveLeft");
}
}
/**
* 把選定內容或插入點向右移動
* @param
selection Dispatch 要移動的內容
* @param count int 移動的距離
*/
public void moveRight(Dispatch selection,int count) {
for(int i =
0;i < count;i ++)
Dispatch.call(selection,"MoveRight");
}
/**
*
把插入點移動到文件首位置
* @param selection Dispatch 插入點
*/
public
void moveStart(Dispatch selection) {
Dispatch.call(selection,"HomeKey",new Variant(6));
}
/**
* 從選定內容或插入點開始查找文本
* @param selection Dispatch
選定內容
* @param toFindText String 要查找的文本
* @return boolean
true-查找到並選中該文本,false-未查找到文本
*/
public boolean find(Dispatch
selection,String toFindText) {
//從selection所在位置開始查詢
Dispatch find = word.call(selection,"Find").toDispatch();
//設置要查找的內容
Dispatch.put(find,"Text",toFindText);
//向前查找
Dispatch.put(find,"Forward","True");
//設置格式
Dispatch.put(find,"Format","True");
//大小寫匹配
Dispatch.put(find,"MatchCase","True");
//全字匹配
Dispatch.put(find,"MatchWholeWord","True");
//查找並選中
return Dispatch.call(find,"Execute").getBoolean();
}
/**
* 把選定內容替換為設定文本
* @param selection
Dispatch 選定內容
* @param newText String 替換為文本
*/
public
void replace(Dispatch selection,String newText) {
//設置替換文本
Dispatch.put(selection,"Text",newText);
}
/**
* 全局替換
* @param selection Dispatch
選定內容或起始插入點
* @param oldText String 要替換的文本
* @param newText
String 替換為文本
*/
public void replaceAll(Dispatch
selection,String oldText,Object replaceObj) {
//移動到文件開頭
moveStart(selection);
if(oldText.startsWith("table") ||
replaceObj instanceof ArrayList)
replaceTable(selection,oldText,(ArrayList) replaceObj);
else
{
String newText = (String) replaceObj;
if(newText==null)
newText="";
if(oldText.indexOf("image") != -1&!newText.trim().equals("") ||
newText.lastIndexOf(".bmp") != -1 || newText.lastIndexOf(".jpg") != -1 ||
newText.lastIndexOf(".gif") != -1){
while(find(selection,oldText)) {
replaceImage(selection,newText);
Dispatch.call(selection,"MoveRight");
}
}else{
while(find(selection,oldText))
{
replace(selection,newText);
Dispatch.call(selection,"MoveRight");
}
}
}
}
/**
* 替換圖片
* @param
selection Dispatch 圖片的插入點
* @param imagePath String 圖片文件(全路徑)
*/
public void replaceImage(Dispatch selection,String imagePath)
{
Dispatch.call(Dispatch.get(selection,"InLineShapes").toDispatch(),"AddPicture",imagePath);
}
/**
* 替換表格
* @param selection Dispatch
插入點
* @param tableName String
表格名稱,形如table$1@1、[email protected]$R@N,R代表從表格中的第N行開始填充,N代表word文件中的第N張表
* @param fields HashMap 表格中要替換的欄位與數據的對應表
*/
public void
replaceTable(Dispatch selection,String tableName,ArrayList dataList)
{
if(dataList.size() <= 1) {
System.out.println("Empty table!");
return;
}
//要填充的列
String[] cols = (String[])
dataList.get(0);
//表格序號
String tbIndex =
tableName.substring(tableName.lastIndexOf("@") + 1);
//從第幾行開始填充
int fromRow =
Integer.parseInt(tableName.substring(tableName.lastIndexOf("$") +
1,tableName.lastIndexOf("@")));
//所有表格
Dispatch tables =
Dispatch.get(doc,"Tables").toDispatch();
//要填充的表格
Dispatch table = Dispatch.call(tables,"Item",new
Variant(tbIndex)).toDispatch();
//表格的所有行
Dispatch rows =
Dispatch.get(table,"Rows").toDispatch();
//填充表格
for(int
i = 1;i < dataList.size();i ++) {
//某一行數據
String[] datas = (String[]) dataList.get(i);
//在表格中添加一行
if(Dispatch.get(rows,"Count").getInt() < fromRow +
i - 1)
Dispatch.call(rows,"Add");
//填充該行的相關列
for(int j = 0;j < datas.length;j ++)
{
//得到單元格
Dispatch cell =
Dispatch.call(table,"Cell",Integer.toString(fromRow + i -
1),cols[j]).toDispatch();
//選中單元格
Dispatch.call(cell,"Select");
//設置格式
Dispatch font = Dispatch.get(selection,"Font").toDispatch();
Dispatch.put(font,"Bold","0");
Dispatch.put(font,"Italic","0");
//輸入數據
Dispatch.put(selection,"Text",datas[j]);
}
}
}
/**
* 保存文件
* @param outputPath String
輸出文件(包含路徑)
*/
public void save(String outputPath) {
Dispatch.call(Dispatch.call(word,"WordBasic").getDispatch(),"FileSaveAs",outputPath);
}
/**
* 關閉文件
* @param document Dispatch
要關閉的文件
*/
public void close(Dispatch doc) {
Dispatch.call(doc,"Close",new Variant(saveOnExit));
word.invoke("Quit",new Variant[]{});
word = null;
}
/**
* 根據模板、數據生成word文件
* @param inputPath
String 模板文件(包含路徑)
* @param outPath String 輸出文件(包含路徑)
* @param
data HashMap 數據包(包含要填充的欄位、對應的數據)
*/
public void toWord(String
inputPath,String outPath,HashMap data) {
String oldText;
Object newValue;
try {
if(doc==null)
doc = open(inputPath);
Dispatch selection =
select();
Iterator keys =
data.keySet().iterator();
while(keys.hasNext())
{
oldText = (String) keys.next();
newValue = data.get(oldText);
replaceAll(selection,oldText,newValue);
}
save(outPath);
} catch(Exception
e) {
System.out.println("操作word文件失敗!");
e.printStackTrace();
} finally {
if(doc !=
null)
close(doc);
}
}
Ⅸ java進行word文檔的開發一般使用什麼技術
需要藉助一些Word操作庫才行,如免費版Spire.Doc for Java,下面是該組件生成簡單的Word文檔
importcom.spire.doc.*;
importcom.spire.doc.documents.Paragraph;
publicclasshelloWorld{
publicstaticvoidmain(String[]args){
Stringoutput="output/helloWorld.docx";
//createWorddocument
Documentdocument=newDocument();
//createanewsection
Sectionsection=document.addSection();
//createanewparagraph
Paragraphparagraph=section.addParagraph();
//appendtext
paragraph.appendText("HelloWorld!");
//savethefile
document.saveToFile(output,FileFormat.Docx);
}
}
Ⅹ java中如何生成word文檔的目錄頁
1.創建帶有格式的word文檔,將該需要動態展示的數據使用變數符替換。 2. 將剛剛創建的word文檔另存為xml格式。3.編輯這個XMl文檔去掉多餘的xml標記,如圖中藍色部分 4.從Freemarker官網【下載】最新的開發包,將freemarker.jar拷貝到自己的開發項目中。 5.新建DocUtil類,實現根據Doc模板生成word文件的方法6.用戶根據自己的需要,調用使用getDataMap獲取需要傳遞的變數,然後調用createDoc方法生成所需要的文檔。