最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何使用poi生成簡(jiǎn)單word文檔并導(dǎo)出

 更新時(shí)間:2024年06月17日 09:29:52   作者:編程經(jīng)驗(yàn)分享  
這篇文章主要介紹了Java如何使用poi生成簡(jiǎn)單word文檔并導(dǎo)出問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

問(wèn)題

項(xiàng)目中需要將業(yè)務(wù)數(shù)據(jù)制成表格并插入word文檔中,同時(shí)還需向word文檔中插入圖片,最后導(dǎo)出word文檔。

如何解決

基于 poi 寫(xiě)了一個(gè)通用的doc操作類,支持插入表格和圖片,最后導(dǎo)出。

代碼

pom

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.5</version>
        </dependency>

doc操作類

public class PoiDocDo {

    XWPFDocument xDoc;
    String name;

    public static PoiDocBuilder builder() { return new PoiDocBuilder();}

    public PoiDocDo(PoiDocBuilder builder) {
        xDoc = new XWPFDocument();
        name = builder.name;
    }

    public static class PoiDocBuilder {
        String name = "default";
        public PoiDocDo build() {
            return new PoiDocDo(this);
        }

        public PoiDocBuilder name(String name) {
            this.name = name;
            return this;
        }
    }

    public PoiDocDo insertParagraph(String text) {
        XWPFParagraph xPara = xDoc.createParagraph();
        xPara.setAlignment(ParagraphAlignment.LEFT);
        XWPFRun run = xPara.createRun();
        run.setFontSize(20);
        run.setText(text);
        run.addCarriageReturn();

        return this;
    }

    /**
     * 往文檔中插入表格
     *
     * @param columns 列頭
     * @param rows 內(nèi)容行
     */
    public PoiDocDo insertTable(List<Map<String, String>> columns,
                                List<Map<String, Object>> rows) {
        XWPFTable xTable = xDoc.createTable(rows.size() + 1, columns.size());
        centerTableContent(xTable, columns.size());

        XWPFTableRow columnNameRow = xTable.getRow(0);
        List<String> columnFields = new ArrayList<>();
        Map<String, String> columnMap;
        for (int i = 0; i < columns.size(); i++) {
            columnMap = columns.get(i);
            columnNameRow.getCell(i).setText(columnMap.get("name"));
            columnFields.add(columnMap.get("field"));
        }
        XWPFTableRow contentRow;
        Map<String, Object> rowMap;
        for (int i = 1; i <= rows.size(); i++) {
            contentRow = xTable.getRow(i);
            rowMap = rows.get(i - 1);
            for (int j = 0; j < columnFields.size(); j++) {
                contentRow.getCell(j).setText(
                        rowMap.getOrDefault(columnFields.get(j), "").toString());
            }
        }
        return this;
    }

    /**
     * 表格內(nèi)容居中,此方法為依次居中每個(gè)表格的內(nèi)容
     *
     * @param xTable 表格
     */
    private void centerTableContent(XWPFTable xTable, int numberOfColumns) {
        for (int i = 0; i < xTable.getNumberOfRows(); i++) {
            for (int j = 0; j < numberOfColumns; j++) {
                XWPFTableCell cell = xTable.getRow(i).getCell(j);
                CTTc cttc = cell.getCTTc();
                CTTcPr ctPr = cttc.addNewTcPr();
                ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
                cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
            }
        }
    }

    public PoiDocDo insertImage(List<Map<String, String>> imageInfoList) {
        XWPFParagraph xPara;
        XWPFRun run;
        String imageName, imageData;
        byte[] bytes;

        for (Map<String, String> imageInfo : imageInfoList) {
            imageName = imageInfo.get("imageName");
            imageData = imageInfo.get("imageData");
            bytes = Base64.getDecoder().decode(imageData);

            xPara = xDoc.createParagraph();
            xPara.setAlignment(ParagraphAlignment.LEFT);
            run = xPara.createRun();
            run.setFontSize(20);
            run.setText(imageName);
            run.addCarriageReturn();
            try {
                run.addPicture(new ByteArrayInputStream(bytes), XWPFDocument.PICTURE_TYPE_JPEG,
                        imageName, Units.toEMU(414), Units.toEMU(284));
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return this;
    }

    public void export(OutputStream outputStream) {
        try (OutputStream os = outputStream) {
            xDoc.write(os);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public void export(String desktopPath) {
        String docName = (desktopPath + "\\" + name).replaceAll("\\\\+", "/");
        try(OutputStream os = Files.newOutputStream(Paths.get(String.format("%s.docx", docName)))) {
            xDoc.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

使用示例

class PoiDocDoTest {

    @Test
    public void test() throws IOException {
        PoiDocDo domainObj = PoiDocDo.builder().name("myDoc").build();

        List<Map<String, String>> images = new ArrayList<>();
        Map<String, String> imageMap = new HashMap<>();
        images.add(imageMap);
        imageMap.put("imageName", "test");
        InputStream inputStream = Files.newInputStream(Paths.get("C:\\Users\\XXX\\Desktop\\XXX.png"));
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        int nRead;
        byte[] data = new byte[16384];
        while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
            buffer.write(data, 0, nRead);
        }
        imageMap.put("imageData", Base64.getEncoder().encodeToString(buffer.toByteArray()));

        List<Map<String, String>> columns = new ArrayList<>();
        Map<String, String> column = new HashMap<>();
        columns.add(column);
        column.put("name", "colum1");
        column.put("field", "field1");

        List<Map<String, Object>> rows = new ArrayList<>();
        Map<String, Object> row = new HashMap<>();
        rows.add(row);
        row.put("field1", "abc");

        domainObj.insertParagraph("This is a paragraph")
                .insertParagraph("picture under me")
                .insertImage(images)
                .insertTable(columns, rows)
                .export("C:\\Users\\XXX\\Desktop");
    }
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中的對(duì)象流總結(jié)(必看篇)

    Java中的對(duì)象流總結(jié)(必看篇)

    下面小編就為大家?guī)?lái)一篇Java中的對(duì)象流總結(jié)(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • SpringBoot的兩種啟動(dòng)方式原理解析(配置方案)

    SpringBoot的兩種啟動(dòng)方式原理解析(配置方案)

    本文介紹了Spring?Boot中兩種啟動(dòng)方式,使用內(nèi)置Tomcat啟動(dòng)和使用外置Tomcat部署,在使用內(nèi)置Tomcat啟動(dòng)時(shí),可以通過(guò)IDEA的main函數(shù)啟動(dòng),也可以使用nohup命令在后臺(tái)運(yùn)行,這篇文章主要介紹了SpringBoot的兩種啟動(dòng)方式原理?,需要的朋友可以參考下
    2025-01-01
  • 在springboot中使用AOP進(jìn)行全局日志記錄

    在springboot中使用AOP進(jìn)行全局日志記錄

    這篇文章主要介紹就在springboot中使用AOP進(jìn)行全局日志記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java遞歸實(shí)現(xiàn)菜單樹(shù)的方法詳解

    Java遞歸實(shí)現(xiàn)菜單樹(shù)的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Java遞歸實(shí)現(xiàn)菜單樹(shù)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • MybatisPlus自定義Sql實(shí)現(xiàn)多表查詢的示例

    MybatisPlus自定義Sql實(shí)現(xiàn)多表查詢的示例

    這篇文章主要介紹了MybatisPlus自定義Sql實(shí)現(xiàn)多表查詢的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • java中ConcurrentHashMap的讀操作為什么不需要加鎖

    java中ConcurrentHashMap的讀操作為什么不需要加鎖

    ConcurrentHashMap完全允許多個(gè)讀操作并發(fā)進(jìn)行,讀操作并不需要加鎖。所以下面這篇文章主要給大家介紹了關(guān)于java中ConcurrentHashMap的讀操作為什么不需要加鎖的相關(guān)資料,需要的朋友可以參考下
    2018-10-10
  • Java 實(shí)戰(zhàn)范例之員工管理系統(tǒng)的實(shí)現(xiàn)

    Java 實(shí)戰(zhàn)范例之員工管理系統(tǒng)的實(shí)現(xiàn)

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+vue+Springboot+ssm+mysql+maven+redis實(shí)現(xiàn)一個(gè)前后端分離的員工管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • 詳解Java反射各種應(yīng)用

    詳解Java反射各種應(yīng)用

    Java除了給我們提供在編譯期得到類的各種信息之外,還通過(guò)反射讓我們可以在運(yùn)行期間得到類的各種信息。通過(guò)反射獲取類的信息,得到類的信息之后,就可以獲取很多相關(guān)內(nèi)容。下面跟著小編一起來(lái)看下吧
    2017-01-01
  • java 使用JDBC構(gòu)建簡(jiǎn)單的數(shù)據(jù)訪問(wèn)層實(shí)例詳解

    java 使用JDBC構(gòu)建簡(jiǎn)單的數(shù)據(jù)訪問(wèn)層實(shí)例詳解

    以下是如何使用JDBC構(gòu)建一個(gè)數(shù)據(jù)訪問(wèn)層,包括數(shù)據(jù)轉(zhuǎn)換(將從數(shù)據(jù)庫(kù)中查詢的數(shù)據(jù)封裝到對(duì)應(yīng)的對(duì)象中……),數(shù)據(jù)庫(kù)的建立,以及如何連接到數(shù)據(jù)庫(kù),需要的朋友可以參考下
    2016-11-11
  • Java手寫(xiě)簡(jiǎn)易版HashMap的使用(存儲(chǔ)+查找)

    Java手寫(xiě)簡(jiǎn)易版HashMap的使用(存儲(chǔ)+查找)

    這篇文章主要介紹了Java手寫(xiě)簡(jiǎn)易版HashMap的使用(存儲(chǔ)+查找),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評(píng)論

临夏县| 太仆寺旗| 蒙自县| 平塘县| 巨鹿县| 馆陶县| 吉林省| 阿拉尔市| 黑河市| 南陵县| 河南省| 乐山市| 濮阳市| 嘉定区| 玛纳斯县| 邛崃市| 商丘市| 望江县| 涿州市| 溆浦县| 财经| 建湖县| 金阳县| 北安市| 上高县| 娄烦县| 睢宁县| 柘城县| 通渭县| 且末县| 青冈县| 陆丰市| 四川省| 佛坪县| 盐池县| 深泽县| 柘城县| 平邑县| 巴塘县| 四川省| 招远市|