java讀取word的修改封面(word封面怎麼修改)

  • 1、JAVA如何修改Word文檔格式
  • 2、如何在java中讀取word文件
  • 3、怎樣用java讀取word中的部分信息?
  • 4、java解析word文檔有哪些方法
  • 5、java操作word 的有哪幾種方式
  • 6、如何使用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用POI對word進行解析。所需jar包,用maven引入

dependency

groupIdorg.apache.poi/groupId

artifactIdpoi-scratchpad/artifactId

version3.2-FINAL/version

/dependency

前端用webuploader上傳控件,限制上傳文件類型僅支持text和word.

後台MultipartFile接收文件,根據ContentType區分文件類型,區分解析獲取文件內容。

word解析:

txt為word的文本內容

Word ? 我只知道POI可以,不過功能不是很完善。畢竟微軟不公開格式。

poi.apache.org

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;iarray.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文檔時,雖然網上介紹了很多插件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();

}

如果沒有特殊需求,可以直接使用jacob_*.zip中提供的jacob.jar和jacob.dll。把jacob.dll文件放在系統可以找得到的

路徑上,一般放c:/windows/system32下就行了,注意你用的jacob.dll文件和你的jacob.jar包要匹配,否則會報錯哦! 

如果想自己編譯也很簡單,把jacob_*_src.zip解開,建個工程,在build.xml中稍作配置即可: 

property name=”JDK” value=”D:\Java\j2sdk1.4.2_13″/  

property name=”MSDEVDIR” value=”D:\Microsoft Visual Studio\VC98″/  

property name=”version” value=”1.12″/

看出來了嗎,你的機器上需要有JDK和VC環境,VC是用來生成jacob.dll文件的,如果編譯時說找不到MSPDB60.DLL,那就在你的

Microsoft Visual Studio目錄下搜索一下,拷貝到D:\Microsoft Visual

Studio\VC98\Bin下就行了。

如果需要對jacob里的jar包改名,(雖然通常不會發生這種情況,但如果你需要兩個版本的jacob同時使用,改名可能是一種選擇),這時你的工作就多一些:

(1)package改名是必須的了,比如我們把src下的com.jacob.activeX改為com.test.jacob.activeX,把

com.jacob.com改為com.test.jacob.com,打包時只有這兩個包是有用的,所以只改它們就夠了。

(2)然後修改build.xml中src.java.jacob.mainpackage的value為com.test.jacob,修改java.class.main的value為com.test.jacob.com.Jacob。

(3)別忘了javaJarBin中打包的源碼路徑也要改,include name=”com/**/*.class” /改為include name=”com/test/**/*.class” /。

(4)build.xml中對生成的dll和jar包也要改個名,比如我們把這兩個文件改為jacob_test.dll和

jacob_test.jar。修改build.xml中的enerated.filename.dll和generated.filename.jar

的value為你新改的名字。

(5)com.test.jacob.com.LibraryLoader中,System.loadLibrary(“jacob”);改成

System.loadLibrary(“jacob_test”);

(6)另外,很重要的,在jni中*.cpp和*.h中com_jacob_com統一改為com_test_jacob_com,com/jacob

/com統一改為com/test/jacob/com。

(7)ant編譯,編譯好的文件在release目錄下。

(8)最後把編譯好的jacob_test.dll文件放在windows/system32下就大功告成了。

現在該用到jacob.jar了,如果你自己修改過jar包的名字,用新改的jar包,如jacob_test.jar,這裡統一稱為jacob.jar。

首先在classpath中引入jacob.jar包,如果是web應用,WEB-INF的lib中也要加入jacob.jar包。

下面給一個例子:

類ReplaceWord.java

import com.jacob.com.*;

import com.jacob.activeX.*;

public class ReplaceWord {

public static void main(String[] args) {

ActiveXComponent app = new ActiveXComponent(“Word.Application”); //啟動word

String inFile = “C:\\test.doc”; //要替換的word文件

try {

app.setProperty(“Visible”, new Variant(false)); //設置word不可見  

Dispatch docs = app.getProperty(“Documents”).toDispatch();

Dispatch doc = Dispatch.invoke(docs,”Open”,Dispatch.Method,new

Object[] { inFile, new Variant(false),new Variant(false) }, new

int[1]).toDispatch();

//打開word文件,注意這裡第三個參數要設為false,這個參數表示是否以只讀方式打開,因為我們要保存原文件,所以以可寫方式打開。

Dispatch

selection=app.getProperty(“Selection”).toDispatch();//獲得對Selection組件

Dispatch.call(selection, “HomeKey”, new Variant(6));//移到開頭

Dispatch find = Dispatch.call(selection, “Find”).toDispatch();//獲得Find組件

Dispatch.put(find, “Text”, “name”); //查找字符串”name”

Dispatch.call(find, “Execute”); //執行查詢

Dispatch.put(selection, “Text”, “張三”); //替換為”張三”

Dispatch.call(doc, “Save”); //保存

Dispatch.call(doc, “Close”, new Variant(false));

} catch (Exception e) {

e.printStackTrace();

} finally {

app.invoke(“Quit”, new Variant[] {});

app.safeRelease();

}

}

}

也許你會問,我怎麼知道要調用哪個方法傳哪些參數來進行操作?別忘了,word還有宏呢!自己錄製一個宏,編輯這個宏就可以看到代碼了!用哪個對象的哪個方法就看你的了。

我總結了一下:

document下的組件都用Dispatch selection=app.getProperty(“Selection”).toDispatch()這種方法獲得;

再往下的組件就需要調用selection的方法來獲取,如 Dispatch find = Dispatch.call(selection, “Find”).toDispatch();

如果某個方法需要參數,Dispatch doc =

Dispatch.invoke(docs,”Open”,Dispatch.Method,new Object[] { inFile, new

Variant(false),new Variant(false) }, new

int[1]).toDispatch()是一個例子,這是調用docs的Open方法,Object[]數組裡就是它需要的參數了;

如果要修改某個組件的屬性呢,用Dispatch.put(find, “Text”, “name”)這種形式,”Text”是屬性名,”name”是值。

原創文章,作者:NHFA8,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/126893.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
NHFA8的頭像NHFA8
上一篇 2024-10-03 23:13
下一篇 2024-10-03 23:13

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論