欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

問題

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

如何解決

基于 poi 寫了一個(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)文章

  • MybatisPlus如何處理Mysql的json類型

    MybatisPlus如何處理Mysql的json類型

    這篇文章主要介紹了MybatisPlus如何處理Mysql的json類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Swing常用組件之單選按鈕和復(fù)選框

    Swing常用組件之單選按鈕和復(fù)選框

    Swing是一個(gè)用于開發(fā)Java應(yīng)用程序用戶界面的開發(fā)工具包,這篇文章主要介紹了Swing常用組件之單選按鈕和復(fù)選框,感興趣的朋友可以參考一下
    2016-05-05
  • AQS核心流程解析cancelAcquire方法

    AQS核心流程解析cancelAcquire方法

    可以清楚的看到在互斥鎖和共享鎖的拿鎖過程中都是有調(diào)用此方法的,而cancelAcquire()方法是寫在finally代碼塊中,并且使用failed標(biāo)志位來控制cancelAcquire()方法的執(zhí)行
    2023-04-04
  • springboot?aop里的@Pointcut()的配置方式

    springboot?aop里的@Pointcut()的配置方式

    這篇文章主要介紹了springboot?aop里的@Pointcut()的配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • maven依賴版本沒有按照最短路徑原則生效的解決方案

    maven依賴版本沒有按照最短路徑原則生效的解決方案

    這篇文章主要介紹了maven依賴版本沒有生效的解決方案,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2021-01-01
  • mybatis?plus中如何編寫sql語句

    mybatis?plus中如何編寫sql語句

    這篇文章主要介紹了mybatis?plus中如何編寫sql語句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 淺談java實(shí)現(xiàn)redis的發(fā)布訂閱(簡單易懂)

    淺談java實(shí)現(xiàn)redis的發(fā)布訂閱(簡單易懂)

    本篇文章主要介紹了淺談java實(shí)現(xiàn) redis的發(fā)布訂閱(簡單易懂),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • Mybatis一對(duì)多與多對(duì)一查詢處理詳解

    Mybatis一對(duì)多與多對(duì)一查詢處理詳解

    這篇文章主要給大家介紹了關(guān)于Mybatis一對(duì)多與多對(duì)一查詢處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java 輸入流中的read(byte[] b)方法詳解

    Java 輸入流中的read(byte[] b)方法詳解

    這篇文章主要介紹了Java 輸入流中的read(byte[] b)方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • java8新特性之方法引用示例代碼

    java8新特性之方法引用示例代碼

    這篇文章主要給大家介紹了關(guān)于java8新特性之方法引用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評(píng)論