package com.wfg.excel; import java.io.File; import java.io.FileInputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; /** * JXL 从excel导入数据到mysql 和 从mysql导出数据到excel 的工具类 * * @author sf * * 2016年8月24日 下午11:00:41 */ public class JXLUtil { /** * * @param excelFilePath excel文件路径 * @param sheetName 第一个工作表名称 * @param cols 对导出的excel的列进行命名的数组 * @param sql JDBC执行的sql查询语句 * @throws Exception */ public static void toExcel(String excelFilePath, String sheetName, String[] cols, String sql) throws Exception { Connection con = null; PreparedStatement ps = null; Statement st = null; ResultSet rs = null; con = JdbcUtil.getConnection(); // 对于大表,使用setFetchSize进行每次多行读取 ps = (PreparedStatement) con.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); ps.setFetchSize(Integer.MIN_VALUE); ps.setFetchDirection(ResultSet.FETCH_REVERSE); rs = ps.executeQuery(); File excelFile = new File(excelFilePath); if (!excelFile.exists()) { excelFile.getParentFile().mkdirs(); } // 创建输出Excel WritableWorkbook book = Workbook.createWorkbook(excelFile); // 创建工作sheet WritableSheet sheet = book.createSheet(sheetName, 0); // 传入 String[] clos 作为excel的第一行 for (int i = 0; i < cols.length; i++) { // Label的坐标(column,row,content) Label label = new Label(i, 0, cols[i]);// 0是第一行 sheet.addCell(label); } int j = 0; while (rs.next()) { j++;// 表示行 for (int i = 0; i < cols.length; i++) { // Label的坐标(column,row,content) sheet.addCell(new Label(i, j, rs.getString(i + 1))); } } book.write(); book.close(); System.out.println("ok...."); JdbcUtil.closeResource(con, st, rs); } /** * * @param excelFilePath excel文件路径 * @param sheetName 第一个工作表名称 * @param cols 查询出的列数 * @param sql JDBC执行的sql查询语句 * @throws Exception */ public static void toExcel(String excelFilePath, String sheetName, int cols, String sql) throws Exception { Connection con = null; PreparedStatement ps = null; Statement st = null; ResultSet rs = null; con = JdbcUtil.getConnection(); // 对于大表,使用setFetchSize进行每次多行读取 ps = (PreparedStatement) con.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); ps.setFetchSize(Integer.MIN_VALUE); ps.setFetchDirection(ResultSet.FETCH_REVERSE); rs = ps.executeQuery(); File excelFile = new File(excelFilePath); if (!excelFile.exists()) { excelFile.getParentFile().mkdirs(); } // 创建输出Excel WritableWorkbook book = Workbook.createWorkbook(excelFile); // 创建工作sheet WritableSheet sheet = book.createSheet(sheetName, 0); int j = 0; while (rs.next()) { for (int i = 0; i < cols; i++) { // Label的坐标(column,row,content) sheet.addCell(new Label(i, j, rs.getString(i + 1))); } j++;// 表示行 } book.write(); book.close(); System.out.println("ok...."); JdbcUtil.closeResource(con, st, rs); } /** * * @param excelFilePath * @param tableName 使用excel的第一行数据进行建表 * @throws Exception */ public static void fromExcel(String excelFilePath, String tableName) throws Exception { Connection conn = JdbcUtil.getConnection(); Statement st = conn.createStatement(); // 创建读入流 Workbook book = Workbook.getWorkbook(new FileInputStream(excelFilePath)); // 默认获取第一张sheet表 Sheet sheet = book.getSheet(0); // 获取总行数 int rowSize = sheet.getRows(); // 获取总列数 int cellSize = sheet.getColumns(); // 创建数组,存储每行的数据 String[] val = new String[cellSize]; // 进入循环读取excel文件 for (int j = 0; j < rowSize; j++) { for (int i = 0; i < cellSize; i++) { Cell cell = sheet.getCell(i, j);// 坐标是 (column,row) val[i] = cell.getContents();// 把每行的数据存储到数组里 } ///////////////////////// 取第一行数据进行建表 if (j == 0) { String sql = "create table " + tableName + "("; for (int k = 0; k < cellSize; k++) { if (k == val.length - 1) { sql += val[k] + " varchar(255))"; } else { sql += val[k] + " varchar(255),"; } } System.out.println(sql); st.executeUpdate(sql); } else { String sql = "insert into " + tableName + " values('"; for (int k = 0; k < val.length; k++) { if (k == val.length - 1) { sql += val[k] + "')"; } else { sql += val[k] + "','"; } } System.out.println(sql); st.executeUpdate(sql); } } // 关流 JdbcUtil.closeResource(conn, st);
} /** * * @param excelFilePath * @param tableName * @param cols 使用给定的数组名称进行建表 * @throws Exception */ public static void fromExcel(String excelFilePath, String tableName, String[] cols) throws Exception { Connection conn = JdbcUtil.getConnection(); Statement st = conn.createStatement(); // 创建读入流 Workbook book = Workbook.getWorkbook(new FileInputStream(excelFilePath)); // 默认获取第一张sheet表 Sheet sheet = book.getSheet(0); // 获取总行数 int rowSize = sheet.getRows(); // 获取总列数 int cellSize = sheet.getColumns(); // 创建数组,存储每行的数据 String[] val = new String[cellSize]; ///////////////////////////////////////////////////////// 建表 String sql = "create table " + tableName + "("; for (int k = 0; k < cols.length; k++) { if (k == cols.length - 1) { sql += cols[k] + " varchar(255))"; } else { sql += cols[k] + " varchar(255),"; } } System.out.println(sql); st.executeUpdate(sql); /////////////////////////////////////////////////////// // 进入循环读取excel文件 for (int j = 0; j < rowSize; j++) { for (int i = 0; i < cellSize; i++) { Cell cell = sheet.getCell(i, j);// 坐标是 (column,row) val[i] = cell.getContents();// 把每行的数据存储到数组里 } sql = "insert into " + tableName + " values('"; for (int k = 0; k < val.length; k++) { if (k == val.length - 1) { sql += val[k] + "')"; } else { sql += val[k] + "','"; } } System.out.println(sql); st.executeUpdate(sql); } // 关流 JdbcUtil.closeResource(conn, st); } }