excel从mysql数据库查询数据_从数据库查询数据写入excel(Java使用POI写入Excel)_超子美食的博客-程序员ITS301

技术标签: excel从mysql数据库查询数据  

因为要查一个线上bug,需要排查的线上订单量非常大,时间紧任务重,为了快速查询排查我花了1个多小时写了一个方法来解决这个问题,

大概的思路:连接线上数据库,循环查询数据后写入excel文件。后续通个excel数据分析,排查问题。

在实现我的这个思路的过程中,我需要知道怎么写入excel,我参考了Dreamer-1 写的这篇文章《Java使用POI读取和写入Excel指南》https://www.cnblogs.com/Dreamer-1/p/10469430.html,

怎么读写excel,全中文,我觉得写的很棒。我就是抄他的。下面图解我的实现过程:

第一步,我要先从数据库查询到我要的数据

用了一个很好用的小的数据库插件NewbieJdbc,对于测试同学来说,我觉得非常实用,推荐使用,自己需要可以百度一下。

1d7323776a6c7981fec51a510c158ea6.png

通过上一步得到数据后,就要映射成需要打印的文件

第二步输出文档

e2504b9d8c075d8daa53ddf2e587b8fa.png

这里有一个很重要的步骤,负责excel对象数据初始化的

Workbook workbook = PoilWriteExcel.exportData(searchData());

整个的PoilWriteExcel这个类都是抄的Dreamer-1 写的方法,只是把我要的数据改了一下,另外重写了我的vo对象TransExcelDataVO

他的文章写的很详细。因为时间很急,事后再看的时候觉得后面可以根据个人的需要做其他改动,非常棒。贴一下我改的PoilWriteExcel这个类。

public class PoilWriteExcel {

private static List CELL_HEADS; //列头

static{

// 类装载时就载入指定好的列头信息,如有需要,可以考虑做成动态生成的列头

CELL_HEADS = new ArrayList<>();

// CELL_HEADS.add("姓名");

// CELL_HEADS.add("年龄");

// CELL_HEADS.add("居住城市");

// CELL_HEADS.add("职业");

CELL_HEADS.add("订单号");

CELL_HEADS.add("租客号");

CELL_HEADS.add("订单状态");

CELL_HEADS.add("操作时间");

CELL_HEADS.add("车辆号");

}

/**

* 生成Excel并写入数据信息

* @param dataList 数据列表

* @return 写入数据后的工作簿对象

*/

public static Workbook exportData(List dataList){

// 生成xlsx的Excel

Workbook workbook = new SXSSFWorkbook();

// 如需生成xls的Excel,请使用下面的工作簿对象,注意后续输出时文件后缀名也需更改为xls

//Workbook workbook = new HSSFWorkbook();

// 生成Sheet表,写入第一行的列头

Sheet sheet = buildDataSheet(workbook);

//构建每行的数据内容

int rowNum = 1;

for (Iterator it = dataList.iterator(); it.hasNext(); ) {

TransExcelDataVO data = it.next();

if (data == null) {

continue;

}

//输出行数据

Row row = sheet.createRow(rowNum++);

convertDataToRow(data, row);

}

return workbook;

}

/**

* 生成sheet表,并写入第一行数据(列头)

* @param workbook 工作簿对象

* @return 已经写入列头的Sheet

*/

private static Sheet buildDataSheet(Workbook workbook) {

Sheet sheet = workbook.createSheet();

// 设置列头宽度

for (int i=0; i

sheet.setColumnWidth(i, 4000);

}

// 设置默认行高

sheet.setDefaultRowHeight((short) 400);

// 构建头单元格样式

CellStyle cellStyle = buildHeadCellStyle(sheet.getWorkbook());

// 写入第一行各列的数据

Row head = sheet.createRow(0);

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

Cell cell = head.createCell(i);

cell.setCellValue(CELL_HEADS.get(i));

cell.setCellStyle(cellStyle);

}

return sheet;

}

/**

* 设置第一行列头的样式

* @param workbook 工作簿对象

* @return 单元格样式对象

*/

private static CellStyle buildHeadCellStyle(Workbook workbook) {

CellStyle style = workbook.createCellStyle();

//对齐方式设置

style.setAlignment(HorizontalAlignment.CENTER);

//边框颜色和宽度设置

style.setBorderBottom(BorderStyle.THIN);

style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 下边框

style.setBorderLeft(BorderStyle.THIN);

style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 左边框

style.setBorderRight(BorderStyle.THIN);

style.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 右边框

style.setBorderTop(BorderStyle.THIN);

style.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 上边框

//设置背景颜色

style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());

style.setFillPattern(FillPatternType.SOLID_FOREGROUND);

//粗体字设置

Font font = workbook.createFont();

font.setBold(true);

style.setFont(font);

return style;

}

/**

* 将数据转换成行

* @param data 源数据

* @param row 行对象

* @return

*/

private static void convertDataToRow(TransExcelDataVO data, Row row){

// private String order_no; //订单

// private String renter_no; //租客号

// private String status; //订单状态

// private String op_time; //订单操作时间

// private String car_no; //车辆号

int cellNum = 0;

Cell cell;

// 订单

cell = row.createCell(cellNum++);

cell.setCellValue(null == data.getOrder_no() ? "" : data.getOrder_no());

// 租客号

cell = row.createCell(cellNum++);

if (null != data.getRenter_no()) {

cell.setCellValue(data.getRenter_no());

} else {

cell.setCellValue("");

}

// 订单状态

cell = row.createCell(cellNum++);

cell.setCellValue(null == data.getStatus() ? "" : data.getStatus());

// 订单操作时间

cell = row.createCell(cellNum++);

cell.setCellValue(null == data.getOp_time() ? "" : data.getOp_time());

// 车辆号

cell = row.createCell(cellNum++);

cell.setCellValue(null == data.getCar_no() ? "" : data.getCar_no());

}

}

写这文章的目的不只是分享,重要的是让自己再学习一遍。因为不经常写代码,总有很多功能有想法,但是实现起来特别难。

最近的一段时间工作节奏不是很忙,有时间的时候我就完善自己写的app的ui自动化框架,最大的收获就是抄代码越来越快了。今天就写到这边吧。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35922490/article/details/113424413

智能推荐

unity3d 没有navMesh的AI坦克大战的实现_callMe坤仔的博客-程序员ITS301

unity3d 没有navMesh的AI坦克大战的实现AI坦克大战1.游戏简介:> * 游戏目标:击毁地方基地。 > * AI行为: 1.拥有一定的视野范围。2.若视野范围内出现敌方坦克,随机选择一个目标,旋转坦克机身,使坦克面朝目标并追踪敌方坦克。3.目标进入攻击范围内,控制炮台瞄准目标并开火,击中率随机。4.若视野范围内无任何敌方坦克

iterator与const_iterator及const iterator区别_SzMing的博客-程序员ITS301

如果你传递过来一个const类型的容器,那么只能用const_iterator来遍历。void Method(const vectorint> vInt){  vectorint>::const_iterator iter;}简单示例  vectorint> ivec;  vectorint>::const_iterator citer1 = ivec.be

mysql5.5 1045_解决mysql ERROR 1045 (28000)-- Access denied for user问题_周咕嘟的博客-程序员ITS301

问题描述(以下讨论范围仅限Windows环境):D:\develop\ide\mysql\mysql5.5\bin&gt; mysql -u root -pEnter password:ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)第一步:编辑mysql安装目录中的配置文件my.i...

ASP.NETCore WebApp + EFCore +Docker +MSSQL(Docker for Window)_菜鸟分享录的博客-程序员ITS301

文章目录一、本机环境二、创建ASP.NET Core WebApp创建项目添加模型搭建基架使用CoreFirst方式初始数据库架构三、MSSQL+Docker拉取MSSQL Docker镜像启动容器环境要求参数解析连接MSSQL容器四、WebApp连接MSSQL五、将WebApp打包为Docker镜像构建Dockerfile打包webapp镜像测试参考赞赏一、本机环境Window 10Docker for windowNETCore 5.0Vistual Studio 2019二、创建ASP

html会员卡中心页面,QQ会员页面制作.html_面小团的博客-程序员ITS301

nav{border: 1px solid ;width: 1000px;height: 50px;background: url(logo.png) no-repeat;background-color: rgb(102,102,102);background-size: contain;color: white;}li{text-indent:6em;list-style-type: none...

Ubuntu解决E 无法修正错误_wvdon的博客-程序员ITS301

Ubuntu:解决E: 无法修正错误当我们安装软件进行更新依赖,apt-get install -f 出现下列软件包有未满足的依赖关系:gstreamer1.0-plugins-ugly : 依赖: gstreamer1.0-plugins-ugly-amr (= 1.8.0-1ubuntu1) 但是 1.8.3-1ubuntu0.1 正要被安装E: 无法修正错误,因为您要求某些软件包保...

随便推点

目标检测MobilenetV2-SSD300 with focal loss流水线_橘子2048的博客-程序员ITS301

0.背景想学习检测,yolov3很多基于darknet,不是很方便,转向同样轻量级的SSD1.介绍https://zhuanlan.zhihu.com/p/79854543https://zhuanlan.zhihu.com/p/79933177https://zhuanlan.zhihu.com/p/663324521.1 数据集本次采用VOC07+12,20类,加上...

Ubuntu18.04下安装MySQL,以及mysql workbench的画ER图及导入数据库(多图)_望舒丶的博客-程序员ITS301_mysql workbencher图导入

Ubuntu 安装MySQL:在csdn上搜如何在Ubuntu 上安装MySQL一定会冒出sudo apt install mysql-server这样的东西,这个东西一点没错,但是如果你按照这样做的话会出大问题,比如:mysql -u root -p是无法链接到数据库的,报28000错误,用mysql  wrokbench也会报28000错误。这样的命令行装当然没问题,...

linux bash使用第一步 设置alias_Fourier_1024的博客-程序员ITS301_bash alias

前言对于bash中的一些常用命令,需要使用alias对其进行简化。之后自己常用的命令也可以慢慢添加进去。修改~./.bash_aliases使用如下命令修改alias。vi ~./.bash_aliases文件内容# 进行文件操作时,要进行询问,以免误操作alias cp='cp -i' # 复制alias rm='rm -i' # 删除alias mv='mv -i' # 移动alias h='history' # 查看历史信息alias c='clear' # 清屏最后存

【计算机网络】OSI参考模型与TCP/IP分层模型对比(体系结构对比)_Steve_Stone的博客-程序员ITS301_书写出osi模型与tcp/ip模型的对比图

#笔记整理协议简单来说,协议就是计算机与计算机之间通过网络实现通信时事先达成的一种“约定“。这种约定使得那些由不同厂商的设备、不同的操作系统组成的计算机之间,只要遵循相同的协议就能够实现通信。就好比两个人使用不同国家的语言就行对话,是无法相互理解的。因此两台计算机之间必须能够支持相同的协议,并遵循相同协议进行处理,才能实现相互通信。OSI参考模型在协议的标准化上,ISO(internati...

android动态加载外部jar包,用eclipse将class转换成dex_hsysir的博客-程序员ITS301

摘要:主要我们把apk提供给第三方,jar包中是需要第三方实现的接口,第三方实现以后可以替换原apk中的jar包。这篇文章的第五步可以将.class类型的jar转换成.dex类型,作用同dx工具。

python hello world程序代码_第一个Python程序——hello world_weixin_39917291的博客-程序员ITS301

helloWorld 一直都是每一门语言经典的第一课,就是使用那一种语言输出 HelloWorld 的字符串下面 ,就用 python。在终端里面输出 HelloWorld代码非常简单,只需要一行就行。print('HELLO WORLD!')以上就是代码的内容。那么,如何去使用它呢?我们有两种快速的使用方法.使用交互式python环境输出写成一个脚本再使用此时,展示一下两种方法.首先是第一种方法...

推荐文章

热门文章

相关标签