POI批量生成Word文档表格_poi批量导入excel
itomcoil 2025-09-14 20:01 3 浏览
前言
当我们在写设计文档,或者是其他涉及到数据架构、表结构时,可以用POI来批量生成表格,例如下面的表格
代码编写
引入POI依赖
<!-- 引入apache poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
封装两个工具类
ExcelUtil,POI操作Excel工具类
<!-- 引入apache poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
WordUtil,POI操作Word工具类
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
import java.math.BigInteger;
import java.util.List;
import java.util.Map;
/**
* POI操作Word工具类
*/
public class WordUtil {
/**
* 简单表格生成
* @param xdoc XWPFDocument对象
* @param titles 表头表头
* @param values 表内容
*/
public static void createSimpleTable(XWPFDocument xdoc,String[] titles,List<Map<String, String>> values){
//行高
int rowHeight = 300;
//开始创建表格(默认有一行一列)
XWPFTable xTable = xdoc.createTable();
CTTbl ctTbl = xTable.getCTTbl();
CTTblPr tblPr = ctTbl.getTblPr() == null ? ctTbl.addNewTblPr() : ctTbl.getTblPr();
CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();
tblWidth.setType(STTblWidth.DXA);
tblWidth.setW(new BigInteger("8600"));//表格宽度
// 创建表头数据
XWPFTableRow titleRow = xTable.getRow(0);
titleRow.setHeight(rowHeight);
for (int i = 0; i < titles.length; i++) {
setCellText(i == 0 ? titleRow.getCell(0) :titleRow.createCell(), titles[i]);
}
// 创建表格内容
for (int i = 0; i < values.size(); i++) {
Map<String, String> stringStringMap = values.get(i);
//设置列内容
XWPFTableRow row = xTable.insertNewTableRow(i + 1);
row.setHeight(rowHeight);
for (String title : titles) {
setCellText(row.createCell(), stringStringMap.get(title));
}
}
}
/**
* 设置列内容
*/
private static void setCellText(XWPFTableCell cell,String text) {
CTTc cttc = cell.getCTTc();
CTTcPr cellPr = cttc.addNewTcPr();
cellPr.addNewTcW().setW(new BigInteger("2100"));
cell.setColor("FFFFFF");
cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
CTTcPr ctPr = cttc.addNewTcPr();
ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
cell.setText(text);
}
}
首先写sql脚本,查出所有表结构信息(表名称、表注释、表字段数据等)
-- mysql查询表名、表注释、表字段数据
SELECT
t.table_name AS '表名称',
t.table_comment AS '表注释',
c.column_name AS '字段名称',
c.column_type AS '数据类型',
c.column_comment AS '字段注释',
c.column_key AS '是否主键',
c.is_nullable AS '是否允许NULL'
FROM
information_schema.COLUMNS c
JOIN information_schema.TABLES t ON c.table_name = t.table_name
WHERE
c.table_schema = (
SELECT DATABASE
());
把结果集拷贝到Excel中
前期工作准备完毕,接下来开始干正事
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test {
private static void tables(){
try {
XWPFDocument xdoc = new XWPFDocument();
HashMap<String, List<Map<String, String>>> hashMap = new HashMap<>();
//获取数据
/*
-- mysql查询表名、表注释、表字段数据
SELECT
t.table_name AS '表名称',
t.table_comment AS '表注释',
c.column_name AS '字段名称',
c.column_type AS '数据类型',
c.column_comment AS '字段注释',
c.column_key AS '是否主键',
c.is_nullable AS '是否允许NULL'
FROM
information_schema.COLUMNS c
JOIN information_schema.TABLES t ON c.table_name = t.table_name
WHERE
c.table_schema = (
SELECT DATABASE
());
*/
File file = new File("E:\\TestExcel01.xlsx");
List<Map<String, String>> list = ExcelUtil.readExcel3(file, 0);
//处理数据,调整成下面的格式
/*
[
{"表名称":[
{},//一条条字段信息
{},//一条条字段信息
{},//一条条字段信息
]}
]
*/
ArrayList<Map<String, String>> arrayList = new ArrayList<>();
String tableName = "";
for (int i = 0; i < list.size(); i++) {
Map<String, String> map = list.get(i);
String tName = String.valueOf(map.get("表名称"));
if(tableName.equals(tName)){
arrayList.add(map);
}else{
hashMap.put(tableName,arrayList);
tableName = tName;
arrayList = new ArrayList<>();
arrayList.add(map);
}
if(list.size() - i == 1){
hashMap.put(tableName,arrayList);
}
}
//生成内容
for (String tName : hashMap.keySet()) {
if("".equals(tName)){
continue;
}
List<Map<String, String>> maps = hashMap.get(tName);
String tZs = String.valueOf(maps.get(0).get("表注释"));
//设置文字,对表格进行描述
XWPFParagraph xp = xdoc.createParagraph();
xp.setSpacingBefore(0);
XWPFRun r1 = xp.createRun();
r1.setFontFamily("宋体");
r1.setFontSize(12);
r1.setTextPosition(0);
r1.addBreak(); // 换行
r1.setText("表名称:"+tName);
r1.addBreak(); // 换行
r1.setText("表注释:"+tZs);
//表格标题
String[] titles = {
"字段名称",
"字段类型",
"字段注释",
"允许空值",
};
//表格内容
List<Map<String, String>> values = new ArrayList<>();
for (Map<String, String> stringStringMap : maps) {
String cName = stringStringMap.get("字段名称");
String cType = stringStringMap.get("数据类型");
String cZs = stringStringMap.get("字段注释");
String isPri = stringStringMap.get("是否主键");
String isNull = stringStringMap.get("是否允许NULL");
//按照表格标题格式进行封装
HashMap<String, String> stringStringHashMap = new HashMap<>();
stringStringHashMap.put("字段名称",cName);
stringStringHashMap.put("字段类型",cType);
stringStringHashMap.put("字段注释",cZs);
stringStringHashMap.put("允许空值",isNull);
values.add(stringStringHashMap);
}
WordUtil.createSimpleTable(xdoc, titles, values);
}
//保存word文件
FileOutputStream fos = new FileOutputStream("E:\\Test1.doc");
xdoc.write(fos);
fos.close();
System.out.println("操作完成!");
}catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
tables();
}
}
运行main进行测试
public static void main(String[] args) {
tables();
}
效果
后记
通过使用POI,批量生成表格,方便快捷、省心高效,项目经理用了都说好!
版权声明
作者:huanzi-qch
出处:
https://www.cnblogs.com/huanzi-qch
若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.
相关推荐
- MySQL中的MVCC到底能不能解决幻读
-
在MySQL当中,只有使用了InnoDB存储引擎的数据库表才支持事务。有了事务就可以用来保证数据的完整以及一致性,保证成批的SQL语句要么全部执行,要么全部不执行。事务用来管理insert、updat...
- 每次写SQL时总忘记语法顺序怎么办,这里一招教你解决
-
MySQL基础(五)-----表达式&函数和分组查询表达式和函数:表达式就是将数字和运算符连接起来的组合,称之为表达式,比如:1+1;函数就是系统自带已经定义好可以直接使用的函数,例如MAX,MIN;...
- 在 MySQL 中使用 UUID 作为主键的存在问题及如何优化?
-
在分布式架构中,UUID(通用唯一标识符)因其能够确保全球唯一性而广泛应用。它不依赖于数据库的自增机制,特别适合于多个系统间的数据同步。然而,尽管UUID提供了很多优势,直接使用它作为MySQL...
- SQL入门知识篇_sql入门教程
-
一、什么是数据库?什么是SQL?1、数据库:存放数据,可以很多人一起使用2、关系数据库:多张表+各表之间的关系3、一张表需要包含列、列名、行4、主键:一列(或一组列),其值能够唯一区分表中的每个行。5...
- MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)
-
目录1.索引基础2.索引类型2.1哈希索引2.2有序数组2.3B+树索引(InnoDB)3.联合索引4.最左前缀原则5.覆盖索引6.索引下推总结:1.索引基础索引对查询的速度有着至...
- Mysql索引覆盖_mysql索引ref
-
作者:京东零售孙涛1.什么是覆盖索引通常情况下,我们创建索引的时候只关注where条件,不过这只是索引优化的一个方向。优秀的索引设计应该纵观整个查询,而不仅仅是where条件部分,还应该关注查询所包...
- MySQL常用语句汇总_mysql常用语句大全
-
一、背景日常测试开发工作中会用到各类SQL语句,很多时候都是想用的时候才发现语句细节记不清楚了,临时网上搜索SQL语法,挺费时费力的,语法还不一定是对的。因此汇总整理了一下MySQL最常用的各类语句,...
- POI批量生成Word文档表格_poi批量导入excel
-
前言 当我们在写设计文档,或者是其他涉及到数据架构、表结构时,可以用POI来批量生成表格,例如下面的表格 代码编写 引入POI依赖<!--引入apachepoi-...
- cmd命令操作Mysql数据库,命令行操作Mysql
-
Mysql数据库是比较流行的数据库之一,维基百科的介绍如下:MySQLisanopen-sourcerelationaldatabasemanagementsystem(RDBMS)....
- MySQL大数据表处理策略,原来一直都用错了……
-
场景当我们业务数据库表中的数据越来越多,如果你也和我遇到了以下类似场景,那让我们一起来解决这个问题。数据的插入,查询时长较长后续业务需求的扩展,在表中新增字段,影响较大表中的数据并不是所有的都为有效数...
- SQL点滴(查询篇):数据库基础查询案例实战
-
本文主要是对微头条SQL小技能的汇总,便于收藏查阅,为数据库初学者提供多快好省又可实际操作的帮助。下面为正文。1.通用*查询在从数据库表中检索所有行与列,若要查询所有数据,通常做法为:select*...
- Mysql学习笔记-InnoDB深度解析_mysql innodb底层原理
-
前言我们在上一篇博客聊了Mysql的整体架构分布,连接层、核心层、存储引擎层和文件系统层,其中存储引擎层作为MysqlServer中最重要的一部分,为我们sql交互提供了数据基础支持。存储引擎和文件...
- 「MySQL调优」大厂MySQL性能优化实战讲解
-
WhyPerformance在1990s,人们还使用拨号接入互联网的时候,浏览一个网页或加入一个线上聊天室需要几分钟的时间去加载是一件很正常的事情。而2009年Akamai公司的报告显示,如果一个网...
- MySQL数据库性能优化_mysql数据库优化及sql调优
-
任何软件平台的运行都需要依赖于数据库的存储,数据库存储着业务系统的关键信息,包含基础的组织、人员及业务流程板块信息等。因此在平台运转过程中,数据库的响应速率直接影响平台的回显速度及用户的友好体验。尽管...
- 面试中的老大难-mysql事务和锁,一次性讲清楚
-
什么是事务在维基百科中,对事务的定义是:事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。事务的四大特性事务包含四大特性,即原子性(Atomicity)、一致性...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)