Java が Word 文書を読み取る場合、インターネット上には poi、java2Word、jacob、itext などのプラグインが多数紹介されていますが、poi ではフォーマットを読み込むことができません(新しい API はまだ研究開発段階のようで、まだ研究開発段階ではないようです)非常に安定しており、java2Word、jaco を使用することを恐れていません。 b はエラーを報告しやすく、登録が見つかりません。これは非常に奇妙です。別のマシンで試しましたが、操作方法はまったく同じでした。エラーを報告しないマシンもあれば、エラーを報告するマシンもありました。解決するための専門家を見つけるためにフォーラムを参照しましたが、その理由はわかりませんでした。プロジェクトの導入と使用は少しわかりにくいですが、itxt を書くのは非常に便利なようですが、長い間情報を確認していました。良い読み方が見つかりませんでした。結局のところ、RTF はオープン ソース形式であり、基本的な IO 操作とエンコード変換のみが必要です。 rtf 形式のファイルは、表面的には doc と何ら変わりません。word で開くことができ、さまざまな形式を設定できます。
----- 実装される機能:RTFテンプレートの内容(フォーマットやテキスト内容)を読み込み、変更部分を置き換えて、新たなRTFドキュメントを作成します。
----- 実装アイデア: テンプレート内の固定部分は手動で入力され、変更された部分は $info$ で表されます。
1. RTF テンプレートのコンテンツをバイト形式で読み取ります
2. 変数コンテンツ文字列を RTF エンコードに変換する
3. 元のテキストの可変部分を置き換えて、新しい RTF ドキュメントを作成します
主な手順は以下のとおりです。
public String bin2hex(String bin) { char[]digital = "0123456789ABCDEF".toCharArray(); StringBuffer sb = new StringBuffer(""); bs = bin.getBytes(); 0; i < bs.length;i++) { ビット = (bs[i] & 0x0f0) >> 4; sb.append("//'"); sb.append(デジタル[ビット]); sb.append(デジタル[ビット]); String readByteRtf(InputStream ins, String path){ String sourcecontent = ""; try{ ins = new FileInputStream(path); b = new byte[1024]; if (ins == null) { System.out.println("ソーステンプレートファイルが存在しません"); } int bytesRead = 0; bytesRead = ins.read(b, 0, 1024 ); // 最終読み取りバイト数を返します if(bytesRead == -1) {// inputStream System.out.println("読み取りテンプレート ファイルの終了"); += new String(b, 0, bytesRead); // バイトを使用して文字列に変換します } }catch(Exception e){ e.printStackTrace() } return sourcecontent ;}
上記はコアコードで、残りの部分は Java の String.replace(oldstr, newstr); メソッドを再アセンブルして実装できるため、ここには掲載しません。ソースコードの詳細については、添付ファイルを参照してください。
ソースコードを実行するための前提条件:
C ドライブに YQ ディレクトリを作成し、添付ファイルの「template.rtf」を YQ ディレクトリにコピーし、OperatorRTF.java ファイルを実行します。次のようなファイル名が YQ ディレクトリに生成されます。 19_cheney_record .rtf ファイル。
パッケージ com; インポート java.io.File;インポート java.io.FileInputStream;インポート java.io.FileWriter;インポート java.io.IOException;インポート java.io.InputStream;インポート java.io.PrintWriter;インポート 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(); .length; i++) { ビット = (bs[i] & 0x0f0) >> 4; sb.append("//'"); sb.append(デジタル[ビット]); sb.append(デジタル[ビット]); String replaceRTF(String content,String replacecontent,int flag){ String rc = strToRtf(replacecontent); if(flag==0){ target = content.replace("$timetop$",rc); } if(flag==1){ target = content.replace("$info$",rc); flag==2){ target = content.replace("$idea$",rc) } if(flag==3){ target = content.replace("$advice$",rc); =4){ターゲット = content.replace("$infosend$",rc); } return target; } public String getSavePath() { String path = "C://YQ"; fDirecotry.exists ()) { fDirecotry.mkdirs(); } パスを返します。 } public String ToSBC(String input){ char[] c = input.toCharArray(); (int i = 0; i < c.length; i++){ if (c[i] == 32){ c[i] = (char) 12288 } if (c[i] < 127){ c [i] = (char) (c[i] + 65248); } } return new String(c) } public void rgModel(String username, String content) { // TODO自動生成されたメソッド スタブ Date current=new Date(); SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String targetname = sdf.format(current).substring(11) ,13) + "時間" += sdf.format(current).substring(14,16) + "分"; += sdf.format(current).substring(17,19) + "秒"; += "_" + ユーザー名 +"_record.rtf"; String strpath = getSavePath(); +"template.rtf"; String Sourcecontent = ""; ins = new FileInputStream(ソース名); byte[1024]; if (ins == null) { System.out.println("ソーステンプレートファイルが存在しません"); } int bytesRead = 0; bytesRead = ins.read(b, 0, 1024 ); // 最終読み取りバイト数を返します if(bytesRead == -1) {// inputStream System.out.println("読み取りテンプレート ファイルの終了"); += new String(b, 0, bytesRead); // バイトを使用して文字列に変換します } }catch(Exception e){ e.printStackTrace(); } String targetcontent = "" String array[]; ~"); 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); if(targetcontent.equals); ("")||targetcontent==""){ out.println(sourcecontent) }else{ out.println(targetcontent); out.close(); fw.close(); System.out.println(getSavePath()+" このディレクトリに生成されたファイル" + targetname + "Success"); } catch (IOException e) { // TODO 自動生成catch block e.printStackTrace(); } } public static void main(String[] args) { // TODO 自動生成されたメソッド スタブ OperatorRTF oRTF = new OperatorRTF(); String content = "2008 年 10 月 12 日 9:00 から 2008 年 10 月 12 日 6:00 まで ~ 薬物の検査方法について言及します ~ 薬物の検査方法について言及します ~ 薬物の検査方法について言及します薬物検査の ~ 薬物検査法を指します"; oRTF.rgModel("cheney",content); }}
POI を使用して Word ファイルから表形式データを読み取る例:
<span style="font-size:14px;">パッケージ com.poi.world; import org.apache.poi.hwpf.HWPFDocument; ; org.apache.poi.hwpf.usermodel.Range をインポートします。 org.apache.poi.hwpf.usermodel.Table; インポート org.apache.poi.hwpf.usermodel.TableIterator; インポート org.apache.poi.hwpf.usermodel.TableRow ; インポート org.apache.poi.poifs.filesystem.POIFSFileSystem{ public static void main(String[] args){ try { String[] s=new String[20]; new FileInputStream("D://mayi.doc"); new HWPFDocument(pfs); 範囲範囲 =hwpf.getRange(); it=new TableIterator(range); int Index=0; while(it.hasNext()){ テーブル tb=(Table)it.next(); for(int i=0;i<tb.numRows();i++){ //System.out. println("行数:"+tb.numRows()); j=0;j<tr.numCells();j++){ //System.out.println("numCells :"+tr.numCells()); // System.out.println("j :"+j) ; TableCell td=tr.getCell(j); for(int k=0;k<td.numParagraphs();k++){ //System.out.println("numParagraphs :"+td.numParagraphs()); 段落 para=td.getParagraph(k); s[index]=para.text().trim(); Index++; } } } } // System.out.println(s) .toString()); for(int i=0;i<s.length;i++){ System.out.println(s[i]) } } catch (例外 e); e.printStackTrace() } } }