❶ java poi 操作word文檔,怎麼寫入帶上下標的文字
1.1 添加poi支持:包下載地址http://www.apache.org/dyn/closer.cgi/poi/release/
1.2 POI對Excel文件的讀取操作比較方便,POI還提供對Word的DOC格式文件的讀取。但在它的發行版本中沒有發布對Word支持的模塊,需要另外下載一個POI的擴展的Jar包。下載地址為http://www.ibiblio.org/maven2/org/textmining/tm-extractors/0.4/ 下載extractors-0.4_zip這個文件
package com.ray.poi.util;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.textmining.text.extraction.WordExtractor;
/**
* 讀寫doc
* @author wangzonghao
*
*/
public class POIWordUtil {
/**
* 讀入doc
* @param doc
* @return
* @throws Exception
*/
public static String readDoc(String doc) throws Exception {
// 創建輸入流讀取DOC文件
FileInputStream in = new FileInputStream(new File(doc));
WordExtractor extractor = null;
String text = null;
// 創建WordExtractor
extractor = new WordExtractor();
// 對DOC文件進行提取
text = extractor.extractText(in);
return text;
}
/**
* 寫出doc
* @param path
* @param content
* @return
*/
public static boolean writeDoc(String path, String content) {
boolean w = false;
try {
// byte b[] = content.getBytes("ISO-8859-1");
byte b[] = content.getBytes();
ByteArrayInputStream s = new ByteArrayInputStream(b);
POIFSFileSystem fs = new POIFSFileSystem();
DirectoryEntry directory = fs.getRoot();
DocumentEntry de = directory.createDocument("WordDocument", s);
FileOutputStream ostream = new FileOutputStream(path);
fs.writeFilesystem(ostream);
s.close();
ostream.close();
} catch (IOException e) {
e.printStackTrace();
}
return w;
}
}
測試
package com.ray.poi.util;
import junit.framework.TestCase;
public class POIUtilTest extends TestCase {
public void testReadDoc() {
try{
String text = POIWordUtil.readDoc("E:/work_space/poi/com/ray/poi/util/demo.doc");
System.out.println(text);
}catch(Exception e){
e.printStackTrace();
}
}
public void testWriteDoc() {
String wr;
try {
wr = POIWordUtil.readDoc("E:/work_space/poi/com/ray/poi/util/demo.doc");
boolean b = POIWordUtil.writeDoc("c:\\demo.doc",wr);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
❷ java 操作word 書簽並插入值
載入Word文檔後,要獲取到那個書簽,然後才能對書簽進行操作。Free Spire.Doc for Java類庫可以獲取Word文檔書簽,並對Word文檔書簽進行替換內容、刪除內容等操作。下面是替換內容的代碼:
importcom.spire.doc.*;
importcom.spire.doc.documents.BookmarksNavigator;
{
publicstaticvoidmain(String[]args){
//載入文件
Documentdoc=newDocument("input.docx");
//定位書簽
=newBookmarksNavigator(doc);
bookmarkNavigator.moveToBookmark("我的書簽");
//用新的內容替換原書簽內容
bookmarkNavigator.replaceBookmarkContent("這部分內容已經被替換。這部分內容已經被替換。這部分內容已經被替換。這部分內容已經被替換。",false);
//保存文件
doc.saveToFile("output.docx",FileFormat.Docx);
}
}
❸ java編程中 怎樣解決在文檔中添加內容,原有的內容不會被清掉。
FileOutputStream(File file, boolean append),append - 如果為 true,則將位元組寫入文件末尾處,而不是寫入文件開始處.這種方法只能實現在文件末尾追加內容.
如果你想實現在文件中任意插入內容,則不能簡單地"直接往文件裡面寫內容" (如果不是插入而是替換的話,可以用RandomAccessFile,它的seek(long pos)可以隨意移動寫文件的指針)
那麼真正地插入內容,是需要先把文件內容載入到內存里——比如把所有讀取的內容加到一個StringBuffer對象中,然後用StringBuffer的insert(int offset,
String str) 函數插入你要插入的字元串,最後重寫文件.
當然嘍,實你的具體需求而定,如果你要操作的文件非常大,那麼全載入到內存中可能不夠,可以先拆分文件,然後處理中間的小文件,最後再合並文件(不過幾種常用的編輯器多半不是這樣的,比如記事本,notepad++,當文本大到一定程度時,都會變卡(記事本最卡..),說明它們可能都是直接全加到內存中的)
❹ Java怎麼操作OpenOffice創建word文檔並向其設置內容
OpenOffice java api:
簡單的說就是利用java程序可以操作OpenOffice的所有功能,比如創建doc文檔,插入文字,設置文字格式等等。
1. OpenOffice 給程序員提供了一個叫UNO (UniversalNetwork Objects)的組件技術.我理解的UNO: OpenOffice 類似於web程序中的伺服器,程序員寫的代碼類似於客戶端,利用UNO提供的介面和服務去完成對OpenOffice文檔的操作。所以寫程序首先要搭建 UNO環境:
1. 下載 OpenOffice
2.復制UNO提供的jar包: unoil.jar, java_uno.jar, juh.jar, jurt.jar, ridl.jar, unoloader.jar. (ps: 安裝了SDK之後在文件夾找)到自己的工程中,引入它們。
3. 下載文檔:DevelopersGuide.pdf.
4. 安裝了SDK後,重新啟動一下機器,然後就可以按照 DevelopersGuide 來學習 UNO 編程了。
5. 需要ava 環境。
補充: 安裝了SDK後, java, c++幫助文檔,樣常式序,其他關於sdk的信息 都放在本地openOffice安裝路徑一個叫sdk目錄下面,enjoy it !
總結一下已經實現的功能和碰到的問題匯總:
1. 首先要得到遠程office組件的上下文.通過:
com.sun.star.uno.XComponentContext xContext = com.sun.star.comp.helper.Bootstrap.bootstrap();
得到,如果OpenOffice安裝路徑不是在工程的路徑下面(我自己猜的), 就會報:
com.sun.star.comp.helper.BootstrapException: no office executable found!
解決辦法: 黑其源代碼, 看了源代碼就會發現其實OpenOffice是在尋找本地的soffice的shell文件,所以弄個變數來保存soffice在系統中的路徑,重新寫一 個Bootstrap就可以了。詳細請參照:論壇 。
2. 得到 XMultiComponentFactory (ComponentFactory 工廠)
com.sun.star.lang.XMultiComponentFactory xMCF = xContext.getServiceManager();
3. 得到各種組件可以通過下面代碼:
// docType 是 與 soffice 同目錄下面的OpenOffice的其他shell文件,swrite等等
protected XComponent newDocComponent(String docType)
throws java.lang.Exception {
String loadUrl = "private:factory/" + docType;
mxRemoteServiceManager = this.getRemoteServiceManager();
Object desktop = mxRemoteServiceManager.createInstanceWithContext(
"com.sun.star.frame.Desktop", mxRemoteContext);
XComponentLoader xComponentLoader = (XComponentLoader) UnoRuntime
.queryInterface(XComponentLoader.class, desktop);
PropertyValue[] loadProps = new PropertyValue[0];
return xComponentLoader.loadComponentFromURL(loadUrl, "_blank", 0,
loadProps);
}
4.得到 XTextDocument
XComponent xEmptyWriterComponent = newDocComponent("swriter");
XTextDocument mxDoc = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class,
xEmptyWriterComponent);
5. 得到一個文檔的引用
XText mxDocText = mxDoc.getText();
6. 得到文檔的屬性列表
XPropertySet mxDocProps = (XPropertySet) UnoRuntime.queryInterface(
XPropertySet.class, mxDoc);
7. 建立游標,用來插入新的內容。
XTextCursor mxDocCursor = mxDocText.createTextCursor();
XSentenceCursor xSentenceCursor = (XSentenceCursor) UnoRuntime
.queryInterface(XSentenceCursor.class, mxDocCursor);
XWordCursor xWordCursor = (XWordCursor) UnoRuntime.queryInterface(
XWordCursor.class, mxDocCursor);
8.得到游標屬性列表
XPropertySet xCursorProps = (XPropertySet) UnoRuntime .queryInterface(XPropertySet.class, mxDocCursor);
9.設置插入文字格式
xCursorProps.setPropertyValue("CharFontName", "宋體");
xCursorProps.setPropertyValue("CharWeight", new Float(FontWeight.BOLD));
xCursorProps.setPropertyValue("CharHeight", new Float(10.5));
// 居中顯示
xCursorProps.setPropertyValue("ParaAdjust", com.sun.star.style.ParagraphAdjust.CENTER);
10.在該游標處插入信息
mxDocText.insertString(xSentenceCursor, 「Hello World", true);
11. 保存的關鍵代碼
protected void storeDocComponent(XComponent xDoc, String storeUrl)
throws java.lang.Exception {
XStorable xStorable = (XStorable) UnoRuntime.queryInterface(
XStorable.class, xDoc);
PropertyValue[] storeProps = new PropertyValue[1];
storeProps[0] = new PropertyValue();
storeProps[0].Name = "FilterName";
storeProps[0].Value = "MS Word 97";
openOfficeJavaLogger.debug("... store \"" + xDoc.toString() + "\" to \"" + storeUrl
+ "\".");
xStorable.storeAsURL(storeUrl, storeProps);