隨著android系統的發展,android已經得到廣泛的認可,作為一名普通的大學生,真的希望自己能在android系統上做一個可以讓大家使用、方便大家工作的一個軟體,最後決定做一個基於andriod的Word格式閱讀器。
經過一些尋找工作,終於找到了可以在android系統上使用的用於讀取Word格式文檔的開源包--POI(The Java API For Microsoft Documents)。:http://poi.apache.org/
POI是Apache的一個子項目,其目的是提供對基於OOXML(Microsoft Office Open XML)和OLE2(Object Linking and Embedding)的各種文檔操作的Java APIs包。該項目分為幾個組件,其中包括一個叫做HWPF的組件,它只能操作Word檔案。這就是我將要使用的組件。HWPF的全稱是Horrible Word Processor Format。翻譯成中文是“可怕的文檔處理格式”,利用HWPF,開發人員可以用純Java代碼實現在Android系統是讀取Word文檔。HWPF組件是POI項目中用來實現Word文檔讀取的一個重要組件,以下是該組件中幾個重要的類:
(1)Range:是所有HWPF物件模型的核心類,Word文檔中字元的所有屬性都是繼承這個類得到的。
(2)HWPFDocument:檔案類。任何形式的Word文檔的最終表現形式都是對該對象進行一些屬性的定製。
(3)Paragraph:是Word文檔中基本的組成部分,每個文檔都被劃分成一個一個的段落,所有的段落最終組成一個Word文檔。
(4)Picture:Word文檔中嵌入的每張圖片都是由Picture對象來表示的,它包括了圖片的大小、內容等一系列屬性。
(5)Table:Word文檔中嵌入的每張表格都是有Table對象來表示的,它包括了表格中每行的TableRow對象和行數等屬性。
其他的類檔案對以上核心的類進行功能補充,最終完成了Word 文檔的讀取。
由於Word格式文檔中有圖片、表格和字串,為了能在android系統上全部進行顯示,選擇使用WebView進行顯示。首先將Word格式文檔中的內容讀取出來,加上對應的HTML標籤,然後寫入HTML檔案中,最後直接使用WebView進行讀取HTML檔案的內容。
判斷當前段落是表格、圖片還是一段文字的代碼:
public void writeParagraphContent(Paragraph paragraph){Paragraph p = paragraph;int pnumCharacterRuns = p.numCharacterRuns();for( int j = 0; j < pnumCharacterRuns; j++){CharacterRun run = p.getCharacterRun(j);if(run.getPicOffset() == 0 || run.getPicOffset() >= 1000){if(presentPicture < pictures.size()){writePicture();}}else{try{String text = run.text();if(text.length() >= 2 && pnumCharacterRuns < 2){output.write(text.getBytes());}else{ int size = run.getFontSize(); int color = run.getColor(); String fontSizeBegin = "<font size=\"" + decideSize(size) + "\">"; String fontColorBegin = "<font color=\"" + decideColor(color) + "\">"; String fontEnd = "</font>"; String boldBegin = "<b>"; String boldEnd = "</b>"; String islaBegin = "<i>"; String islaEnd = "</i>"; output.write(fontSizeBegin.getBytes()); output.write(fontColorBegin.getBytes()); if(run.isBold()){ output.write(boldBegin.getBytes()); } if(run.isItalic()){ output.write(islaBegin.getBytes()); } output.write(text.getBytes()); if(run.isBold()){ output.write(boldEnd.getBytes()); } if(run.isItalic()){ output.write(islaEnd.getBytes()); } output.write(fontEnd.getBytes()); output.write(fontEnd.getBytes()); }}catch(Exception e){System.out.println("Write File Exception");}}}}
在SDCARD上建立一個圖片的代碼:
public void writePicture(){Picture picture = (Picture)pictures.get(presentPicture);byte[] pictureBytes = picture.getContent();Bitmap bitmap = BitmapFactory.decodeByteArray(pictureBytes, 0, pictureBytes.length);makePictureFile();presentPicture++;File myPicture = new File(picturePath);try{FileOutputStream outputPicture = new FileOutputStream(myPicture);outputPicture.write(pictureBytes);outputPicture.close();}catch(Exception e){System.out.println("outputPicture Exception");}String imageString = "<img src=\"" + picturePath + "\"";if(bitmap.getWidth() > screenWidth){imageString = imageString + " " + "width=\"" + screenWidth + "\"";}imageString = imageString + ">";try{output.write(imageString.getBytes());}catch(Exception e){System.out.println("output Exception");}}
運行效果:
讀取圖片和文字:
讀取表格和文字:
原始碼及測試Word文檔打包:
http://download.csdn.net/source/3432624
本文系“暑期大學生部落格大賽-2011 Android成長篇“參賽文章