Java POI 导出Oracle数据表写入Excel文件(Excel2007 xlsx)
来源:互联网 发布:js金沙7726下载 编辑:程序博客网 时间:2024/05/18 12:37
突发凌想,用java swing写了一个小工具,可以将数据库中的表直接导成一个Excel2007版本的文件,经过测试最多可以导出120000条左右,和设置的jvm内存大小有关,小批量数据用下还可以,不适合大数据,由于读取表头的sql语句可能和其它数据库不通用,暂时可能只支持Oracle数据库。
下载地址在文章最后面。
整体效果:
先看下效果图:
工程结构与配置文件:
部分源码分析:
源代码部分很简单,分为以下部分:
1、数据库连接
此部分略过,properties文件配置 + JDBC都懂。
2、读取数据
A:先获取数据表的总列数,
获取表列名(Excel表头)SQL语句:
select t1.column_name as fieldName ,t1.data_type as fieldType, t1.data_length as fieldLength,t1.data_precision,t1.nullable as isNull,t1.data_default as data_default,t2.comments as fieldDirections,(select m.constraint_type from user_constraints m,user_cons_columns n where m.constraint_name = n.constraint_name and m.constraint_type='P'and n.column_name = t1.column_name and n.table_name =t1.table_name) as isPK from user_tab_cols t1 inner join user_col_comments t2 on t2.table_name=t1.table_name and t2.column_name=t1.column_name and t1.table_name='你的表名称'
B:再获取每次读取的条数,然后就可以封装成一个二维数组,分页循环读取数据。
// 总行数int rowLength = this.getCurrentCount(tableName, startIndex, endIndex);// 总列数int colLength = tableFields.size();// 储存数据,二维数组Object [][] tableData = null;tableData = new Object[rowLength][colLength];
3、写入文件
这部分循环读取数据,然后用POI写入Excel文件,代码很简单,如下:
/** * 写入文件,适用多线程 * @return * @throws IOException * @throws InterruptedException */public String poiWriteFile(){String result = "";String value = null;TableQuery tableQuery = new TableQuery();// 判断数据表是否存在if(!tableQuery.checkExists(tableName)){result = "数据表:"+tableName+" 不存在。";}else{// 获取数据总量int dataCount = tableQuery.getCount(tableName);if(dataCount > DBConfig.getDataUpperLimit()){result = "数据表:"+tableName+" 共"+dataCount+"条数据,超出上限"+DBConfig.getDataUpperLimit()+"条,\n请选择数量较小的表。";return result;}// 记录执行开始时间long startTime = System.currentTimeMillis();this.initProgressBar(dataCount);this.setProgress(dataCount, 0);// 计算分页int pageSize = DBConfig.getPageSize();int pageCount = (dataCount + pageSize - 1) / pageSize;// 获取数据表列信息List<TableField> tableFields = tableQuery.getTableField(tableName);XSSFWorkbook workBook = new XSSFWorkbook();XSSFSheet sheet = workBook.createSheet(tableName);// 创建一个工作薄对象XSSFRow row;// 创建一个行对象int rowIndex = 0;// 当前行下标XSSFCell cell;// 创建单元格// 写文件头(Excel的第一行)row = sheet.createRow(rowIndex);for(int h = 0; h < tableFields.size(); h++){cell = row.createCell(h);cell.setCellValue(tableFields.get(h).getName());}rowIndex ++;// 分页读取数据,写入文件for(int page = 1; page <= pageCount; page ++){int startIndex = (page-1)*pageSize;int endIndex = page*pageSize;Object [][] tableData = tableQuery.getTableData(tableName, tableFields, startIndex, endIndex);/* if(page != 1){// 分批次追加文件FileInputStream is = new FileInputStream(saveFile);// 读取上次创建的文件workBook = new XSSFWorkbook(is);sheet = workBook.getSheet(tableName);}*/for(int i = 0; i < tableData.length; i++){row = sheet.createRow(rowIndex);for(int j = 0; j < tableFields.size(); j++){cell = row.createCell(j);if(tableData[i][j] != null){value = tableData[i][j].toString();if(tableFields.get(j).getType().equalsIgnoreCase("NUMBER")){cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC);cell.setCellValue(Double.parseDouble(value));}else{cell.setCellType(XSSFCell.CELL_TYPE_STRING);cell.setCellValue(value);}}}rowIndex ++;this.setProgress(dataCount, rowIndex);}/*// 写文件,分批次追加FileOutputStream os = new FileOutputStream(file);// 将文档对象写入文件输出流workBook.write(os);// 关闭文件输出流os.close();*///System.out.println("已经导出:"+rowIndex+" 条。");System.gc();}if(frame != null){frame.setProgressBarLabel("数据导出完毕,正在生成文件……");}String fileOk = "文件生成失败!";// 写文件try {FileOutputStream os = new FileOutputStream(saveFile);// 将文档对象写入文件输出流workBook.write(os);// 关闭文件输出流os.close();fileOk = "文件生成完毕!";} catch (IOException e) {e.printStackTrace();}String expOk = "失败!";if(fileOk.equalsIgnoreCase("文件生成完毕!")){expOk = "成功!";}// 记录执行结束时间long endTime = System.currentTimeMillis();// 计算执行历时时间long timeDifference = (endTime - startTime)/(1000);result = "导出"+expOk+"\n历时:"+timeDifference+" 秒";System.out.println(result);if(frame != null){frame.setProgressBarLabel(fileOk);}}return result;}
分页读取数据时,把数据全部写入XSSFWorkbook,再生成文件。若没读取一次数据就保存文件,以后每次都以追加的形式写入文件,效率低得很。
4、Java Swing UI
UI是用NetBeans画的,很简单,没什么技术含量,有兴趣的可以看下关键部分源代码,NetBeans自动生成的那部分就不要看了。
demo下载地址:
下载文件压缩包内含源代码与编译后的文件
CSDN地址:http://download.csdn.net/detail/u010019941/7674735
百度网盘地址:http://pan.baidu.com/s/1pJJkgrD
POI下载地址:http://poi.apache.org/download.html 官方当前最新版3.11
0 0
- Java POI 导出Oracle数据表写入Excel文件(Excel2007 xlsx)
- 关于sqlserver 2005 导出数据表到excel2007 (*.xlsx)
- POI解析Excel(.xls)和Excel2007(.xlsx)
- Java 实现导出excel表 POI/Java实现不同excel格式(*.xls、*.xlsx)文件的读取
- java操作poi生成excel文件(.xlsx)
- groovy : poi 导出 Excel xlsx
- POI-处理大Excel文件(xlsx)
- JAVA 创建excel(xlsx)POI技术
- C# 讀取Excel、xlsx文件Excel2007
- JavaEE POI读取 Excel中的数据,(Excel2003(xls), Excel2007(xlsx))
- java poi导出excel文件
- Go语言导出excel文件(.xlsx)
- 解析xlsx文件---Java读取Excel2007
- java:poi读取excel文件,分xls和xlsx
- java使用POI读取excel文件,兼容xls和xlsx
- java 导出excel表格(.xlsx)
- POI 通用导出Excel(.xls,.xlsx)
- POI 通用导出Excel(.xls,.xlsx)
- 《大话数据结构》读书笔记
- GDB使用
- javascript元素宽度更改(表格等)源代码
- 网络套接字
- 炒冷饭系列:设计模式 抽象工厂模式
- Java POI 导出Oracle数据表写入Excel文件(Excel2007 xlsx)
- 各大OJ题集
- 基础总结篇之一:Activity生命周期
- KX鼠标悬浮提示
- git shell 命令大全
- Gcc编译连接动态库和静态库
- hdu 4873 ZCC Loves Intersection(大数+概率)
- 秋叶语录总结提炼
- js访问jsf的SelectOneRadio组件方式