java实现百万级数据导出excel
来源:互联网 发布:u盘照片导入mac 编辑:程序博客网 时间:2024/06/14 01:26
package com.exportBigExcel;import java.io.FileOutputStream;import java.io.OutputStream;import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import java.util.ArrayList;import java.util.Date;import java.util.List;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFCellStyle;import org.apache.poi.hssf.usermodel.HSSFFont;import org.apache.poi.hssf.usermodel.HSSFRichTextString;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.hssf.util.HSSFColor;public class ExportBigExcel {private static List<String> fileNames = new ArrayList<String>();//生成的所有表名及路径@SuppressWarnings("unchecked")public static void export() throws Exception{//声明需要导出数据库String dataBaseName = "reward";//获取数据库连接Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("***", "***", "***");//声明statementDatabaseMetaData databaseMetaData = conn.getMetaData();//获取所有表ResultSet resultSet = databaseMetaData.getTables(dataBaseName, dataBaseName,null, new String[]{"TABLE"});//获取所有表名字List<String> tables = new ArrayList<String>();while(resultSet.next()){String table_name = resultSet.getString("TABLE_NAME");System.out.println("表名: " + table_name);tables.add(table_name);}Statement statement = conn.createStatement();for(String tableName : tables){//获取每张表的总记录数resultSet = statement.executeQuery("select count(*) from " + dataBaseName + "." + tableName);int count = 0;if(resultSet.next()){count = resultSet.getInt(1);//获取每张表的记录数}int rowCount = 60000;//每页最大数int pageCount = 0;//总页数,(转换成总的excel文件的个数)int sign = 0;if(count % rowCount == 0){pageCount = count / rowCount;}else{pageCount = count / rowCount + 1;}//分页获取数据,防止内存溢出for(int i = 0; i < pageCount; i++){/** * 获取所有列名 */ResultSet rs = statement.executeQuery("show full columns from " + tableName); List<String> headers = new ArrayList<String>();if (rs != null && rs.next()) { while (rs.next()) { headers.add( rs.getString("Comment")); } }/** * 添加行数据 */resultSet = statement.executeQuery("select * from " + dataBaseName + "." + tableName + " limit " + sign + "," + rowCount);sign += rowCount;List<List<String>> data = new ArrayList<List<String>>();while(resultSet.next()){@SuppressWarnings("rawtypes")List rowData = new ArrayList();for(int j = 0; j < headers.size(); j++){String val = resultSet.getString(j + 1);rowData.add(val);}data.add(rowData);}/** * 导出到excel */Thread thread = new ExportExcelUtil(i, tableName, headers, data);thread.start();}}}//返回输出的表名public static List<String> getFileNames(){return fileNames;}//添加输出的表名public static void callBackFileName(String fileName){fileNames.add(fileName);}}//到处到excel,采用多线程class ExportExcelUtil extends Thread{int number;//第多少张表String sheetTitle;//表名List<String> headers;//列名List<List<String>> result;//行数据public ExportExcelUtil(int number, String sheetTitle,List<String> headers, List<List<String>> result) {super();this.number = number;this.sheetTitle = sheetTitle;this.headers = headers;this.result = result;}@Overridepublic void run() {try {exportExcel(sheetTitle, number, headers, result);} catch (Exception e) {e.printStackTrace();};}/** * @Title: exportExcel * @Description: 导出Excel的方法 * @param workbook * @param sheetNum (sheet的位置,0表示第一个表格中的第一个sheet) * @param sheetTitle (sheet的名称) * @param headers (表格的标题) * @param result (表格的数据) * @param out (输出流) * @throws Exception */public void exportExcel(String sheetTitle,int number,List<String> headers, List<List<String>> result) throws Exception {OutputStream out = new FileOutputStream("F:/java/works/reward" + sheetTitle + number + ".xls");System.out.println("F:/java/works/reward/" + sheetTitle + number + ".xls");// 生成一个表格//声明工作薄HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet sheet = workbook.createSheet();// 设置表格默认列宽度为20个字节sheet.setDefaultColumnWidth((short) 20);workbook.setSheetName(0,sheetTitle);// 生成一个样式HSSFCellStyle style = workbook.createCellStyle();// 设置这些样式style.setFillForegroundColor(HSSFColor.PALE_BLUE.index);style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);style.setBorderBottom(HSSFCellStyle.BORDER_THIN);style.setBorderLeft(HSSFCellStyle.BORDER_THIN);style.setBorderRight(HSSFCellStyle.BORDER_THIN);style.setBorderTop(HSSFCellStyle.BORDER_THIN);style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 生成一个字体HSSFFont font = workbook.createFont();font.setColor(HSSFColor.BLACK.index);font.setFontHeightInPoints((short) 12);font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 把字体应用到当前的样式style.setFont(font);// 指定当单元格内容显示不下时自动换行style.setWrapText(true);// 产生表格标题行HSSFRow row = sheet.createRow(0);for (int i = 0; i < headers.size(); i++) {HSSFCell cell = row.createCell((short) i);cell.setCellStyle(style);HSSFRichTextString text = new HSSFRichTextString(headers.get(i));cell.setCellValue(text.toString());}// 遍历集合数据,产生数据行if (result != null) {int index = 1;for (List<String> m : result) {row = sheet.createRow(index);int cellIndex = 0;for (String str : m) {HSSFCell cell = row.createCell((short) cellIndex);cell.setCellValue(str);cellIndex++;}index++;}}workbook.write(out);out.close();ExportBigExcel.callBackFileName(sheetTitle + number + ".xls");//回调函数输出表名}}
0 0
- java实现百万级数据导出excel
- java导出百万级数据到excel解决方案
- poi百万级数据导出excel
- JAVA笔记-如何将百万级数据高效的导出到Excel表单
- JAVA笔记-如何将百万级数据高效的导出到Excel表单
- 用Perl从oracle导出百万级数据到excel
- java往csv文件中导出百万级数据
- 润乾报表百万级数据量导出EXCEL解决方案分析
- java程序跨服务器跨数据库批量导入导出百万级数据
- java导出百万级数据分分钟事情,亲测有效!
- Java批量拆入百万级数据
- PHP百万级数据导出csv格式OR文本格式
- 使用数据泵导出导入百万级数据
- 百万级数据查询
- 百万级数据优化
- java中JDBC实现往MySQL插入百万级数据的实例代码
- java中JDBC实现往MySQL插入百万级数据的实例代码
- C#报表数据批量快速导出到Excel(百万级数据秒级内完成)
- 产品经理常见的6大文案陷阱
- HDU 2014 青年歌手大奖赛_评委会打分
- 第4章 初始不是需求阶段
- (洛谷P2014 选课)<树形DP>
- RocketMQ源码解析:Message拉取&消费(上)
- java实现百万级数据导出excel
- 微信小程序开发手记之八:一个小程序上线后的总结(下)
- [cv]Fourier-transform
- python 函数 —— list.sort()
- Spring Boot 入门
- C++常用STL汇总(以容器为主)
- 我的Linux环境
- Logistic回归模型和Zeppelin简单使用
- Python 基础 —— 判断一个对象是否为可迭代对象