1. 程式人生 > >安卓使用POI讀取及修改Word文件(.docx格式)

安卓使用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 生成Wordfreemarker方式

首先在pom檔案中加入下面這個依賴(不是Maven專案的話,把jar包匯入專案即可) <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</ar

Java根據Word模板生成WordFreemarker實現

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 追加寫入wordPOI如何寫入word親測有效POI報錯Fail to save: an error occurs while saving the package

一、POI寫入word文件 首先參考W3Shool的教程(上述快速指南)的“Apache POI Word - 文件”一節,對於建立文件和寫入段落都有清晰的闡釋。我不再贅述。但是其寫入段落的方式每次都會覆蓋曾經寫入的內容。那麼經過我探索一番要這麼處理... 二、POI

java操作wordjacob,poi

專案需要,使用者從系統裡面下載word文件,該文件進行了填寫限制和加密,使用者只能在固定位置填寫內容。現要求系統驗證上傳的附件是否從系統上下載下來的。 思路:系統上面的文件都加入一個固定書籤,使用者上傳文件的時候,檢驗文件裡是否包含這個書籤。 採用jacob

如何批量修改Word中的表格樣式和題注格式

在進行大型專案的方案文件設計時,一個文件中有可能涉及到上百個圖表,在最後定稿的時候,需要進行統一的格式化處理。面對這些數目龐大的表格,挨個用格式刷進行處理,一路刷下來往往手都會刷酸,更令人奔潰的是好不容易刷完了,發現字型或大小不對,這時候可能需要再重新刷一遍。那