Java 如何将表格数据导入word文档中

作者:George.Liu73 时间:2023-08-13 10:38:55 

Java 表格数据导入word文档中

个人觉得这个功能实在搞笑,没什么意义,没办法提了需求就要实现,(太好说话了把我)

我的实现是再word中生成一个与 excel行,列 一样的一个表格,然后把从excel拿到的数据(exList参数)依次放到word表格中


   public static void createFile(HttpServletResponse response, String fileName, List<List<String>> exList) {

try {
           setResponseHeader(response, fileName);
           //生成一个word模版文件
           XWPFDocument document = new XWPFDocument();

XWPFTable table = document.createTable(exList.size(), exList.get(0).size());
           XWPFTableRow row;

for (int i = 0; i < exList.size(); i++) {

List<String> sdf = exList.get(i);

row = table.getRow(i);

for (int j = 0; j < exList.get(i).size(); j++) {
                   String s =sdf.get(j);
                   row.getCell(j).setText(s);
                   row.getCell(j).setWidthType(TableWidthType.AUTO);
               }
               //将数据插入表格中  pos:0 表示 第一个表格
               document.setTable(0,table);
           }
           ServletOutputStream outputStream = response.getOutputStream();
           BufferedOutputStream bufferStream = new BufferedOutputStream(outputStream, 1024);
           document.write(bufferStream);
           document.close();
           bufferStream.close();;
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
   public static void setResponseHeader(HttpServletResponse response, String name) {
       try {
           name = new String(name.getBytes(), "ISO8859-1");
       } catch (UnsupportedEncodingException e) {
           e.printStackTrace();
       }
response.setContentType("multipart/form-data");
       //要保存的文件名
       response.setHeader("Content-Disposition", "attachment;filename=" + name + ".docx");
       response.addHeader("Pargam", "no-cache");
       response.addHeader("Cache-Control", "no-cache");
   }

Java poi导入word表格数据的经过

一、过程及遇到的问题和解决思路

需要导入的是一个word文档,内容是以表格的形式保存在word中

1、poi对word表格的空格处可以自动识别出来并赋值为 " ",这一点比poi导入excel人性化(excel默认是跳过这个空格)

2、对于某些情况下,肉眼无法看出表格格式问题,但是程序可以识别出来,怀疑是表格后期人工修改过,导致表格外观没问题但是行列属性不一致,导致读取时遇到这些地方报错,解决思路:可以在读取每一行之前先判断列数是否正确,poi中可以获取每行的列数,不正确的证明此列有问题,舍弃跳过。

二、代码


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

package com.example.importtomysql;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class ImportWord {
   public List<TableColumn> testReadByDoc(String path) throws Exception {
       File f = new File(path);
       InputStream is = new FileInputStream(f);
       HWPFDocument doc = new HWPFDocument(is);
       //输出书签信息
       //  this.printInfo(doc.getBookmarks());
       //输出文本
       //  System.out.println(doc.getDocumentText());
       Range range = doc.getRange();
       //   this.printInfo(range);
       //读表格
       List<TableColumn> tableColumns = this.readTable(range);
       //读列表
       //  this.readList(range);
       //把当前HWPFDocument写到输出流中
       // doc.write(new FileOutputStream("D:\\temp\\test.doc"));
       is.close();
       return tableColumns;
   }

/**
    * 输出书签信息
    * @param bookmarks
    */
   private void printInfo(Bookmarks bookmarks) {
       int count = bookmarks.getBookmarksCount();
       System.out.println("书签数量:" + count);
       Bookmark bookmark;
       for (int i=0; i<count; i++) {
           bookmark = bookmarks.getBookmark(i);
           System.out.println("书签" + (i+1) + "的名称是:" + bookmark.getName());
           System.out.println("开始位置:" + bookmark.getStart());
           System.out.println("结束位置:" + bookmark.getEnd());
       }
   }

/**
    * 读表格
    * 每一个回车符代表一个段落,所以对于表格而言,每一个单元格至少包含一个段落,每行结束都是一个段落。
    * @param range
    */
   private List<TableColumn> readTable(Range range) {
       List<TableColumn> tableColumns = new ArrayList<>();
       //遍历range范围内的table。
       TableIterator tableIter = new TableIterator(range);
       Table table;
       TableRow row;
       TableCell cell;
       int i=0;
       int k=0;
       while (tableIter.hasNext()&&i<=1) {

table = tableIter.next();
           int rowNum = table.numRows();
           for (int j=0; j<rowNum; j++) {
               TableColumn tableColumn = new TableColumn();
               row = table.getRow(j);
               int cellNum = row.numCells();
//                for (int k=0; k<cellNum; k++) {
//                    cell = row.getCell(k, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
//
//                    //输出单元格的文本
//                    System.out.println(cell.text().trim());
//                }
               k++;
               if(12==cellNum){
                   tableColumn.setId(row.getCell(0).text().trim());
                   tableColumn.setSscj(row.getCell(1).text().trim());
                   tableColumn.setQlfl(row.getCell(2).text().trim());
                   tableColumn.setXmmc(row.getCell(3).text().trim());
                   tableColumn.setZx(row.getCell(4).text().trim());
                   tableColumn.setBlx(row.getCell(5).text().trim());
                   tableColumn.setSsyj(row.getCell(6).text().trim());
                   tableColumn.setCbjg(row.getCell(7).text().trim());
                   tableColumn.setZrsx(row.getCell(8).text().trim());
                   tableColumn.setSxyj(row.getCell(9).text().trim());
                   tableColumn.setZzqx(row.getCell(10).text().trim());
                   tableColumn.setZzyj(row.getCell(11).text().trim());
//                tableColumn.setBz(row.getCell(12).text().trim());
                   tableColumns.add(tableColumn);

if(679==k){
                       System.out.println(k  +" " +row.getCell(0).text().trim()+" " +row.getCell(3).text().trim());
                   }
//                    System.out.println(k +" " +row.getCell(0).text().trim()+" "+row.getCell(3).text().trim());
               }else {
                   System.out.println(k);
               }

}
           i++;
       }
       return tableColumns;
   }

/**
    * 读列表
    * @param range
    */
   private void readList(Range range) {
       int num = range.numParagraphs();
       Paragraph para;
       for (int i=0; i<num; i++) {
           para = range.getParagraph(i);
           if (para.isInList()) {
               System.out.println("list: " + para.text());
           }
       }
   }

/**
    * 输出Range
    * @param range
    */
   private void printInfo(Range range) {
       //获取段落数
       int paraNum = range.numParagraphs();
       System.out.println(paraNum);
       for (int i=0; i<paraNum; i++) {
           System.out.println("段落" + (i+1) + ":" + range.getParagraph(i).text());
       }
       int secNum = range.numSections();
       System.out.println(secNum);
       Section section;
       for (int i=0; i<secNum; i++) {
           section = range.getSection(i);
           System.out.println(section.getMarginLeft());
           System.out.println(section.getMarginRight());
           System.out.println(section.getMarginTop());
           System.out.println(section.getMarginBottom());
           System.out.println(section.getPageHeight());
           System.out.println(section.text());
       }
   }
}

来源:https://blog.csdn.net/LGeorge73/article/details/103834790

标签:Java,数据,导入,word
0
投稿

猜你喜欢

  • java组件commons-fileupload实现文件上传、下载、在线打开

    2022-02-24 22:16:59
  • java网络爬虫连接超时解决实例代码

    2022-02-02 06:57:28
  • Java环境下高德地图Api的使用方式

    2022-06-13 06:43:59
  • Unity 实现鼠标滑过UI时触发动画的操作

    2021-05-31 19:24:18
  • 全面了解Java中的内部类和匿名类

    2023-01-05 09:14:23
  • Dynamic和Var的区别及dynamic使用详解

    2022-09-22 13:18:23
  • 详解C语言内核字符串转换方法

    2022-12-09 13:53:55
  • FastJSON字段智能匹配踩坑的解决

    2022-07-29 19:32:26
  • 基于C#实现网页爬虫

    2021-10-30 08:13:44
  • Maven引入外部jar的几种方法(小结)

    2022-11-10 01:35:30
  • Android不规则封闭区域填充色彩的实例代码

    2022-10-17 08:33:05
  • Java基础知识精通块作用域与条件及switch语句

    2022-12-21 17:50:07
  • 实例详解C#正则表达式

    2023-06-23 00:03:03
  • Java Http请求方式之RestTemplate常用方法详解

    2021-06-29 02:32:51
  • Android实现象棋游戏

    2021-10-23 02:32:15
  • Android Webview使用小结

    2022-12-06 07:26:19
  • 举例讲解Java编程中this关键字与super关键字的用法

    2023-03-09 01:46:02
  • java匿名内部类实例简析

    2022-12-26 21:25:15
  • Java实现分页查询功能

    2023-03-03 14:30:19
  • 深入浅析Java中普通代码块、构造代码块与静态代码块

    2023-04-14 15:16:35
  • asp之家 软件编程 m.aspxhome.com