安卓使用POI讀取及修改Word文件(.docx格式)
說明:上一篇文章使用poi對.doc格式的word文件進行了讀取和更改,但很多情況下還需要在word文件中插入圖片,這時就需要對.docx格式的word進行操作了。
1.製作文書
文書在原始碼中可以直接看到,簡單說明一下:文書有普通欄位、表格、特定位置的圖片,又在頁首頁尾中加了普通欄位和表格,基本滿足對於word操作的所有情況。
2.導包
還是上篇中poi-3.9壓縮資源包中的jar包,對.docx格式文件的操作用到XWPFDocument方法,使用到所有ooxml相關的jar包。
3.build配置
這次的build配置有點特殊,特別拿出來截圖一下。就像上一篇說的一樣,apache的很多配置在安卓是跑不通的,這次導包後,你會遇到方法過多,檔案重複,基於jdk1.6以上版本的變異儲存等一系列問題,可以按照下面的方法處理。當然不同的android studio版本可能也會有不同的處理方法,可以百度一下。
4.許可權還是儲存許可權,直接上程式碼吧,註解的也很詳細
public class MainActivity extends AppCompatActivity { //建立生成的檔案地址 private static final String newPath = "/storage/emulated/0/test.docx"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ActivityCompat.requestPermissions(this, new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 0); } Button go = (Button) findViewById(R.id.go); go.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { initData(); } }); } private void initData() { Map<String, Object> map = new HashMap<String, Object>(); map.put("$TITLE$", "標題");//$TITLE$只是個識別符號,你也可以用${},[]等等 map.put("$TXT1$", "表格第一行"); map.put("$CONTENT1$", "第一行內容"); map.put("$TXT2$", "表格第二行"); map.put("$CONTENT2$", "第二行內容"); map.put("$CONTENT3$", "頁尾中的內容"); map.put("$TXT4$", "頁尾表格第一行"); map.put("$CONTENT4$", "頁尾第一行內容"); map.put("$TXT5$", "頁尾表格第二行"); map.put("$CONTENT5$", "頁尾第二行內容"); try { //讀取示例文書 InputStream is = getAssets().open("test.docx"); //自定義的XWPFDocument,解決官方版圖片不顯示問題 CustomXWPFDocument document = new CustomXWPFDocument(is); //讀取段落(一般段落,頁首頁尾沒辦法讀取) List<XWPFParagraph> listParagraphs = document.getParagraphs(); processParagraphs(listParagraphs, map); //讀取頁尾 List<XWPFFooter> footerList = document.getFooterList(); processParagraph(footerList, map); //處理表格 Iterator<XWPFTable> it = document.getTablesIterator(); while (it.hasNext()) {//迴圈操作表格 XWPFTable table = it.next(); List<XWPFTableRow> rows = table.getRows(); for (XWPFTableRow row : rows) {//取得表格的行 List<XWPFTableCell> cells = row.getTableCells(); for (XWPFTableCell cell : cells) {//取得單元格 if ("$IMG$".equals(cell.getText())) { //直接插入圖片會在文件的最底端,所以要插在固定位置,要把圖片放在表格裡 //所以使用判斷單元格,並清除單元格放置圖片的方式來實現圖片定位 cell.removeParagraph(0); XWPFParagraph pargraph = cell.addParagraph(); document.addPictureData(getAssets().open("1.png"), XWPFDocument.PICTURE_TYPE_PNG); document.createPicture(document.getAllPictures().size() - 1, 120, 120, pargraph); } List<XWPFParagraph> paragraphListTable = cell.getParagraphs(); processParagraphs(paragraphListTable, map); } } } FileOutputStream fopts = new FileOutputStream(newPath); document.write(fopts); if (fopts != null) { fopts.close(); } } catch (Exception e) { e.printStackTrace(); } } //處理頁尾中的段落,其實就是用方法讀取了下頁尾中的內容,然後也會當做一般段落處理 private void processParagraph(List<XWPFFooter> footerList, Map<String, Object> map) { if (footerList != null && footerList.size() > 0) { for (XWPFFooter footer : footerList) { //讀取一般段落 List<XWPFParagraph> paragraphs = footer.getParagraphs(); processParagraphs(paragraphs, map); //處理表格 List<XWPFTable> tables = footer.getTables(); for (int i = 0; i < tables.size(); i++) { XWPFTable xwpfTable = tables.get(i); List<XWPFTableRow> rows = xwpfTable.getRows(); for (XWPFTableRow row : rows) {//取得表格的行 List<XWPFTableCell> cells = row.getTableCells(); for (XWPFTableCell cell : cells) {//取得單元格 List<XWPFParagraph> paragraphListTable = cell.getParagraphs(); processParagraphs(paragraphListTable, map); } } } } } } //處理段落 public static void processParagraphs(List<XWPFParagraph> paragraphList, Map<String, Object> param) { if (paragraphList != null && paragraphList.size() > 0) { for (XWPFParagraph paragraph : paragraphList) { List<XWPFRun> runs = paragraph.getRuns(); for (XWPFRun run : runs) { String text = run.getText(0); if (text != null) { boolean isSetText = false; for (Map.Entry<String, Object> entry : param.entrySet()) { String key = entry.getKey(); if (text.indexOf(key) != -1) { isSetText = true; Object value = entry.getValue(); if (value instanceof String) {//文字替換 text = text.replace(key, value.toString()); } } } if (isSetText) { run.setText(text, 0); } } } } } } }
5.效果展示
6.原始碼
點我下載。
相關推薦
安卓使用POI讀取及修改Word文件(.docx格式)
說明:上一篇文章使用poi對.doc格式的word文件進行了讀取和更改,但很多情況下還需要在word文件中插入圖片,這時就需要對.docx格式的word進行操作了。 1.製作文書 文書在原始碼中可以直接看到,簡單說明一下:文書有普通欄位、表格、特定位置的圖片,又在頁首頁尾
安卓使用POI讀取及修改Word文件(.doc格式)
前言:如果你可愛的專案經理要求安卓端的你來操作word實現各種功能,不要猶豫,直接動之以情曉之以理,因為這本來就是java的poi,安卓雖然源自java,但對於java的很多東西是不支援的,已有的各種jar包也不方便更改,各種報錯會搞的你腦闊疼。所以編輯word文件這種事讓後
使用Freemarker匯出Word文件(包含圖片)程式碼實現及總結
本篇是關於利用FreeMarker匯出Word的實現步驟。採用FreeMarker非常的靈活,能夠按照自己指定的樣式設定並輸出內容,操作簡單方便,程式碼實現也容易。 下面是實現的效果圖: 下面是實現步驟: 1.新增FreeMarker需要的jar包(這裡用的是2.3.28版本,從網上的maven倉庫
POI操作word文件 (採用mob)
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Date; import java.util.HashMap; import java.util.Map
Java Web 生成Word文件(freemarker方式)
首先在pom檔案中加入下面這個依賴(不是Maven專案的話,把jar包匯入專案即可) <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</ar
Java根據Word模板生成Word文件(Freemarker實現)
public class WordExportUtil { private static Configuration configuration; static { configuration = new Configuration(); configur
Word文件恢復,電腦突然關機 如何一步步將.asd恢復為Word文件 (詳解)
剛剛遇到了一個扎心的問題,搗騰了一會兒終於搞定了,相信你肯定也遇到過這樣的一種情況,辛辛苦苦編輯好的Word文件材料,突然間遇上電腦崩潰關機了,文件還沒來得及儲存,哭的心都有了,但哭沒用啦 O(∩_∩)O哈哈~。 那麼如何恢復未儲存的文件呢?你是否有發現自己的電腦中其實還存在著這樣一個
使用Java生成word文件(附原始碼)
原文地址:http://blog.51cto.com/favccxx/1331115 當我們使用Java生成word文件時,通常首先會想到iText和POI,這是因為我們習慣了使用這兩種方法操作Excel,自然而然的也想使用這種生成word文件。但是當我們需要動態生成word時,通常不僅要能夠顯
如何將excel表格轉化為word文件(去掉表格)
第一次寫這種技術的部落格,有點辛苦,中間有一次,CSDN抽風,導致我不得不重新寫。 這是我自己摸索的,之前參考其他的教程,但是還是有點不同,他們用的是老舊的excel 2010和word 2010。 工
python-docx操作word文件(*.docx)
tin comment turn spl end nta document .sh font 目錄 基礎操作 對象關系 添加樣式 中文字體微軟雅黑,西文字體Times Ne
通過POI讀取Word文件(.doc)
1.jar匯入(https://mvnrepository.com/search?q=poi),一定要注意版本一致(本例是3.0.2) 2.java程式碼 public Map saveTxldl(FileItem upload) { Map result = new Ha
安卓手機下載的視頻文件誤刪怎麽恢復 手機數據恢復方法
手機現在是越來越普及,功能越來越強大。除了通訊之外現在更多人會用手機來觀看視頻,電影等。在有WiFi的情況下一般都是在線觀看,如果是沒有網的條件下呢?比如在火車上無聊的時候也會有人想到看電視,那麽他們一般都是事先下載好的。有時候會發現下載好的視頻文件誤刪除了,沒有了那該怎麽辦呢?有沒有簡單方法能恢復的?
python批量修改word文件名
mat graph 操作 erro 利好 chan 都沒有 list 無法 最近不小心把硬盤給格式化了,由於當時的文件沒有備份,所以一下所有的文件都沒有了,於是只能采取補救措施,用文件恢復軟件恢復了一部分的數據出來,但是恢復完畢的文件的文件名全丟了,所有的文件只有代號,如下
linux系統下文件夾以及文件的權限查看及修改;以及文件和文件夾刪除 rm -rf 命令的使用
系統 chang html 更改 修改文件 art 文件名 mage 管理命令 1、直接查看文件或者文件夾的權限命令: >>ll 或者 >>ls -l r代表讀取權限,w寫權限,x代表執行權限 第一個代表文件類型,-代表是普通文件,d代表是文
詳述 hosts 文件的作用及修改 hosts 文件的方法
-s 架設 ive 屏蔽 -i 替換 就是 一個 用戶 1 什麽是hosts文件? hosts是一個沒有擴展名的系統文件,其基本作用就是將一些常用的網址域名與其對應的 IP 地址建立一個關聯“ 數據庫 ”。當用戶在瀏覽器中輸入一個需要登錄的網址時,系統會首先自動從hos
java POI合併兩個word文件
有需要的可以將主函式中寫死的地方改為一個List。 import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream;
UE4 縮小安卓打包體積(翻譯自官方文件)
減少APK包大小 無論您的UE4專案針對哪種型別的Android裝置,將Android應用程式包(APK)的大小減小到Google Play商店的50MB限制都可能具有挑戰性。在以下指南中,我
POI 追加寫入word文件,POI如何寫入word文件(親測有效),POI報錯Fail to save: an error occurs while saving the package
一、POI寫入word文件 首先參考W3Shool的教程(上述快速指南)的“Apache POI Word - 文件”一節,對於建立文件和寫入段落都有清晰的闡釋。我不再贅述。但是其寫入段落的方式每次都會覆蓋曾經寫入的內容。那麼經過我探索一番要這麼處理... 二、POI
java操作word文件(jacob,poi)
專案需要,使用者從系統裡面下載word文件,該文件進行了填寫限制和加密,使用者只能在固定位置填寫內容。現要求系統驗證上傳的附件是否從系統上下載下來的。 思路:系統上面的文件都加入一個固定書籤,使用者上傳文件的時候,檢驗文件裡是否包含這個書籤。 採用jacob
如何批量修改Word文件中的表格樣式和題注格式?
在進行大型專案的方案文件設計時,一個文件中有可能涉及到上百個圖表,在最後定稿的時候,需要進行統一的格式化處理。面對這些數目龐大的表格,挨個用格式刷進行處理,一路刷下來往往手都會刷酸,更令人奔潰的是好不容易刷完了,發現字型或大小不對,這時候可能需要再重新刷一遍。那