使用JDBC+POI把Excel中的数据导出到MySQL
POI是Apache的一套读MS文档的API,用它还是可以比较方便的读取Office文档的。目前支持Word,Excel,PowerPoint生成的文档,还有Visio和Publisher的。
http://poi.apache.org/download.html
具体的用法可以查阅文档里面您的quickguide,我给出我自己的范例,从xls文件把数据导出到MySQL。
这里面我总是假定excel在第一个sheet并且第一行是字段名,能够自动从第一行读取字段名建立一个表然后导入数据。
- package JDBCPractice;
- import java.io.*;
- import java.sql.*;
- import org.apache.poi.hssf.*;
- import org.apache.poi.ss.usermodel.*;
- import org.apache.poi.hssf.usermodel.HSSFCell;
- import org.apache.poi.hssf.usermodel.HSSFRow;
- import org.apache.poi.hssf.usermodel.HSSFSheet;
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
- // 导入hssf来处理xls文件
- import org.apache.poi.poifs.filesystem.POIFSFileSystem;
- // 使用poifs来读文件更加的轻松,当然也可以不用
- public class main {
- /**
- * @param args
- */
- public static void main(String[] args) {
- String addr = "/home/ulysess/Developer/T_user.XLS";
- HSSFWorkbook wb = null;
- HSSFSheet contents = null;
- try {
- POIFSFileSystem exlf = new POIFSFileSystem(new FileInputStream(addr));
- wb = new HSSFWorkbook(exlf);
- } catch (FileNotFoundException e) {
- System.out.println("文件不存在,请检查路径");
- e.printStackTrace();
- return;
- } catch (IOException e) {
- System.out.println("读取文件时发生IO错误");
- e.printStackTrace();
- return;
- }
- contents = wb.getSheetAt(0);
- //取第一个sheet
- int minColIdx, maxColIdx, maxRowIdx;
- maxRowIdx = contents.getLastRowNum();
- HSSFRow xlrow = contents.getRow(0);
- //-----------------------建立MySQL连接-------------------------
- try {
- Class.forName("com.mysql.jdbc.Driver");
- //建立一个mysql的driver的实例,并将其注册到DriversManager
- } catch (ClassNotFoundException e) {
- System.out.println("Unable load Driver");
- e.printStackTrace();
- }
- String name = "root";
- String password = "moratorium";
- String url = "jdbc:mysql://localhost/USERDATAS";
- try {
- Connection con = DriverManager.getConnection(url, name, password);
- //建立连接
- Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
- ResultSet.CONCUR_UPDATABLE);
- try {
- /*stmt.execute("create table ORGDATAS( " +
- "USERID VARCHAR(24) NOT NULL PRIMARY KEY," +
- " USERNAME VARCHAR(24), SEX TINYINT, " +
- "PASSWORD VARCHAR(64), USERTYPE TINYINT, " +
- "FREEAUTHEN TINYINT, CERTIFICATETYPE TINYINT, " +
- "CERTIFICATENO VARCHAR(24), EDUCATION TINYINT, " +
- "POSTCODE VARCHAR(10), ADDRESS VARCHAR(128), " +
- "PHONENO VARCHAR(24), BIRTHDAY DATE, EMAIL VARCHAR(64) );");*/
- //建表
- HSSFCell cel, refcell;
- HSSFRow ferr = contents.getRow(1);
- String ctbsql = "create table TARGETTABLE (";
- for(int i = xlrow.getFirstCellNum(); i < xlrow.getLastCellNum(); i++) {
- cel = xlrow.getCell(i);
- refcell = ferr.getCell(i);
- if(refcell == null) {
- ctbsql = ctbsql.concat(cel.getStringCellValue() + " VARCHAR(64)");
- } else {
- switch(refcell.getCellType()) {
- case Cell.CELL_TYPE_FORMULA:
- case Cell.CELL_TYPE_STRING:
- ctbsql = ctbsql.concat(cel.getStringCellValue() + " VARCHAR(64)");
- break;
- case Cell.CELL_TYPE_NUMERIC:
- ctbsql = ctbsql.concat(cel.getStringCellValue() + " INT");
- break;
- case Cell.CELL_TYPE_BOOLEAN:
- ctbsql = ctbsql.concat(cel.getStringCellValue() + " TINYINT");
- break;
- default:
- ctbsql = ctbsql.concat(cel.getStringCellValue() + " VARCHAR(64)");
- }
- }
- if(i < xlrow.getLastCellNum()-1) {
- if(i == 0 ) {
- ctbsql = ctbsql.concat(" NOT NULL PRIMARY KEY");
- }
- ctbsql = ctbsql.concat(", ");
- }else {
- ctbsql = ctbsql.concat(");");
- }
- }
- stmt.execute(ctbsql);
- //跟据前两行的内容来建表
- } catch(SQLException e) {
- }
- ResultSet rs = stmt.executeQuery("select * from TARGETTABLE");
- minColIdx = xlrow.getFirstCellNum();
- maxColIdx = xlrow.getLastCellNum();
- //设定每列的最小最大索引
- int cnt =0 ;
- boolean infirstrow = true;
- //for each式遍历整个表
- for (Row row : contents) {
- if(infirstrow) {
- infirstrow = false;
- continue;
- }
- rs.moveToInsertRow();
- System.out.println("insert " + cnt++);
- for (Cell cell : row) {
- if(cell == null) {
- continue;
- }
- switch(cell.getCellType()) {
- case Cell.CELL_TYPE_FORMULA:
- case Cell.CELL_TYPE_STRING:
- rs.updateString(cell.getColumnIndex() + 1, cell.getStringCellValue());
- break;
- case Cell.CELL_TYPE_NUMERIC:
- rs.updateInt(cell.getColumnIndex() + 1, (int) cell.getNumericCellValue());
- break;
- case Cell.CELL_TYPE_BOOLEAN:
- rs.updateShort(cell.getColumnIndex() + 1, (short) cell.getNumericCellValue());
- break;
- default:
- rs.updateString(cell.getColumnIndex() + 1, cell.getStringCellValue());
- }
- }
- rs.insertRow();
- }
- System.out.println("--------------------------");
- } catch (SQLException e) {
- e.printStackTrace();
- System.out.println("/n--- SQLException caught ---/n");
- while (e != null) {
- System.out.println("Message: "
- + e.getMessage ());
- System.out.println("SQLState: "
- + e.getSQLState ());
- System.out.println("ErrorCode: "
- + e.getErrorCode ());
- e = e.getNextException();
- e.printStackTrace();
- System.out.println("");
- }
- } catch (IllegalStateException ie) {
- ie.printStackTrace();
- }
- }
- }
在项目中用户需要导入大量Excel表格数据到数据库,为此需求自己写了一个读取Excel数据的Java类,现将代码贴出来与大家一起分享。
该类提供两个方法,一个方法用于读取Excel表格的表头,另一个方法用于读取Excel表格的内容。
(注:本类需要POI组件的支持,POI是apache组织下的一个开源组件,)
代码如下:
- package org.hnylj.poi.util;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.Map;
- import org.apache.poi.hssf.usermodel.HSSFCell;
- 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.poifs.filesystem.POIFSFileSystem;
- /**
- * 操作Excel表格的功能类
- * @author:hnylj
- * @version 1.0
- */
- public class ExcelReader {
- private POIFSFileSystem fs;
- private HSSFWorkbook wb;
- private HSSFSheet sheet;
- private HSSFRow row;
- /**
- * 读取Excel表格表头的内容
- * @param InputStream
- * @return String 表头内容的数组
- *
- */
- public String[] readExcelTitle(InputStream is) {
- try {
- fs = new POIFSFileSystem(is);
- wb = new HSSFWorkbook(fs);
- } catch (IOException e) {
- e.printStackTrace();
- }
- sheet = wb.getSheetAt(0);
- row = sheet.getRow(0);
- //标题总列数
- int colNum = row.getPhysicalNumberOfCells();
- String[] title = new String[colNum];
- for (int i=0; i<colNum; i++) {
- title[i] = getStringCellValue(row.getCell((short) i));
- }
- return title;
- }
- /**
- * 读取Excel数据内容
- * @param InputStream
- * @return Map 包含单元格数据内容的Map对象
- */
- public Map<Integer,String> readExcelContent(InputStream is) {
- Map<Integer,String> content = new HashMap<Integer,String>();
- String str = "";
- try {
- fs = new POIFSFileSystem(is);
- wb = new HSSFWorkbook(fs);
- } catch (IOException e) {
- e.printStackTrace();
- }
- sheet = wb.getSheetAt(0);
- //得到总行数
- int rowNum = sheet.getLastRowNum();
- row = sheet.getRow(0);
- int colNum = row.getPhysicalNumberOfCells();
- //正文内容应该从第二行开始,第一行为表头的标题
- for (int i = 1; i <= rowNum; i++) {
- row = sheet.getRow(i);
- int j = 0;
- while (j<colNum) {
- //每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据
- //也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean
- str += getStringCellValue(row.getCell((short) j)).trim() + "-";
- j ++;
- }
- content.put(i, str);
- str = "";
- }
- return content;
- }
- /**
- * 获取单元格数据内容为字符串类型的数据
- * @param cell Excel单元格
- * @return String 单元格数据内容
- */
- private String getStringCellValue(HSSFCell cell) {
- String strCell = "";
- switch (cell.getCellType()) {
- case HSSFCell.CELL_TYPE_STRING:
- strCell = cell.getStringCellValue();
- break;
- case HSSFCell.CELL_TYPE_NUMERIC:
- strCell = String.valueOf(cell.getNumericCellValue());
- break;
- case HSSFCell.CELL_TYPE_BOOLEAN:
- strCell = String.valueOf(cell.getBooleanCellValue());
- break;
- case HSSFCell.CELL_TYPE_BLANK:
- strCell = "";
- break;
- default:
- strCell = "";
- break;
- }
- if (strCell.equals("") || strCell == null) {
- return "";
- }
- if (cell == null) {
- return "";
- }
- return strCell;
- }
- /**
- * 获取单元格数据内容为日期类型的数据
- * @param cell Excel单元格
- * @return String 单元格数据内容
- */
- private String getDateCellValue(HSSFCell cell) {
- String result = "";
- try {
- int cellType = cell.getCellType();
- if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
- Date date = cell.getDateCellValue();
- result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1)
- + "-" + date.getDate();
- } else if (cellType == HSSFCell.CELL_TYPE_STRING) {
- String date = getStringCellValue(cell);
- result = date.replaceAll("[年月]", "-").replace("日", "").trim();
- } else if (cellType == HSSFCell.CELL_TYPE_BLANK) {
- result = "";
- }
- } catch (Exception e) {
- System.out.println("日期格式不正确!");
- e.printStackTrace();
- }
- return result;
- }
- public static void main(String[] args) {
- try {
- //对读取Excel表格标题测试
- InputStream is = new FileInputStream("C:\\Excel表格测试.xls");
- ExcelReader excelReader = new ExcelReader();
- String[] title = excelReader.readExcelTitle(is);
- System.out.println("获得Excel表格的标题:");
- for (String s : title) {
- System.out.print(s + " ");
- }
- //对读取Excel表格内容测试
- InputStream is2 = new FileInputStream("C:\\Excel表格测试.xls");
- Map<Integer,String> map = excelReader.readExcelContent(is2);
- System.out.println("获得Excel表格的内容:");
- for (int i=1; i<=map.size(); i++) {
- System.out.println(map.get(i));
- }
- } catch (FileNotFoundException e) {
- System.out.println("未找到指定路径的文件!");
- e.printStackTrace();
- }
- }
- }

- package org.hnylj.poi.util;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.Map;
- import org.apache.poi.hssf.usermodel.HSSFCell;
- 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.poifs.filesystem.POIFSFileSystem;
- /**
- * 操作Excel表格的功能类
- * @author:hnylj
- * @version 1.0
- */
- public class ExcelReader {
- private POIFSFileSystem fs;
- private HSSFWorkbook wb;
- private HSSFSheet sheet;
- private HSSFRow row;
- /**
- * 读取Excel表格表头的内容
- * @param InputStream
- * @return String 表头内容的数组
- *
- */
- public String[] readExcelTitle(InputStream is) {
- try {
- fs = new POIFSFileSystem(is);
- wb = new HSSFWorkbook(fs);
- } catch (IOException e) {
- e.printStackTrace();
- }
- sheet = wb.getSheetAt(0);
- row = sheet.getRow(0);
- //标题总列数
- int colNum = row.getPhysicalNumberOfCells();
- String[] title = new String[colNum];
- for (int i=0; i<colNum; i++) {
- title[i] = getStringCellValue(row.getCell((short) i));
- }
- return title;
- }
- /**
- * 读取Excel数据内容
- * @param InputStream
- * @return Map 包含单元格数据内容的Map对象
- */
- public Map<Integer,String> readExcelContent(InputStream is) {
- Map<Integer,String> content = new HashMap<Integer,String>();
- String str = "";
- try {
- fs = new POIFSFileSystem(is);
- wb = new HSSFWorkbook(fs);
- } catch (IOException e) {
- e.printStackTrace();
- }
- sheet = wb.getSheetAt(0);
- //得到总行数
- int rowNum = sheet.getLastRowNum();
- row = sheet.getRow(0);
- int colNum = row.getPhysicalNumberOfCells();
- //正文内容应该从第二行开始,第一行为表头的标题
- for (int i = 1; i <= rowNum; i++) {
- row = sheet.getRow(i);
- int j = 0;
- while (j<colNum) {
- //每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据
- //也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean
- str += getStringCellValue(row.getCell((short) j)).trim() + "-";
- j ++;
- }
- content.put(i, str);
- str = "";
- }
- return content;
- }
- /**
- * 获取单元格数据内容为字符串类型的数据
- * @param cell Excel单元格
- * @return String 单元格数据内容
- */
- private String getStringCellValue(HSSFCell cell) {
- String strCell = "";
- switch (cell.getCellType()) {
- case HSSFCell.CELL_TYPE_STRING:
- strCell = cell.getStringCellValue();
- break;
- case HSSFCell.CELL_TYPE_NUMERIC:
- strCell = String.valueOf(cell.getNumericCellValue());
- break;
- case HSSFCell.CELL_TYPE_BOOLEAN:
- strCell = String.valueOf(cell.getBooleanCellValue());
- break;
- case HSSFCell.CELL_TYPE_BLANK:
- strCell = "";
- break;
- default:
- strCell = "";
- break;
- }
- if (strCell.equals("") || strCell == null) {
- return "";
- }
- if (cell == null) {
- return "";
- }
- return strCell;
- }
- /**
- * 获取单元格数据内容为日期类型的数据
- * @param cell Excel单元格
- * @return String 单元格数据内容
- */
- private String getDateCellValue(HSSFCell cell) {
- String result = "";
- try {
- int cellType = cell.getCellType();
- if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
- Date date = cell.getDateCellValue();
- result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1)
- + "-" + date.getDate();
- } else if (cellType == HSSFCell.CELL_TYPE_STRING) {
- String date = getStringCellValue(cell);
- result = date.replaceAll("[年月]", "-").replace("日", "").trim();
- } else if (cellType == HSSFCell.CELL_TYPE_BLANK) {
- result = "";
- }
- } catch (Exception e) {
- System.out.println("日期格式不正确!");
- e.printStackTrace();
- }
- return result;
- }
- public static void main(String[] args) {
- try {
- //对读取Excel表格标题测试
- InputStream is = new FileInputStream("C:\\Excel表格测试.xls");
- ExcelReader excelReader = new ExcelReader();
- String[] title = excelReader.readExcelTitle(is);
- System.out.println("获得Excel表格的标题:");
- for (String s : title) {
- System.out.print(s + " ");
- }
- //对读取Excel表格内容测试
- InputStream is2 = new FileInputStream("C:\\Excel表格测试.xls");
- Map<Integer,String> map = excelReader.readExcelContent(is2);
- System.out.println("获得Excel表格的内容:");
- for (int i=1; i<=map.size(); i++) {
- System.out.println(map.get(i));
- }
- } catch (FileNotFoundException e) {
- System.out.println("未找到指定路径的文件!");
- e.printStackTrace();
- }
- }
- }

通过该类提供的方法就能读取出Excel表格中的数据,数据读取出来了,其他的,对这些数据进行怎样的操作,要靠你另外写程序去实现,因为该类只提供读取Excel表格数据的功能。
说明:在该类中有一个getStringCellValue(HSSFCell cell)方法和一个getDateCellValue(HSSFCell cell)方法,前一个方法用于读取那些为字符串类型的数据,如果你的Excel表格中填写的是日期类型的数据,则你应该在readExcelContent(InputStream is)方法里调用getDateCellValue(HSSFCell cell)方法,因为若调用getStringCellValue(HSSFCell cell)方法读取日期类型的数据将得到的是一个浮点数,这很可能不符合实际要求。
- package JDBCPractice;
- import java.io.*;
- import java.sql.*;
- import org.apache.poi.hssf.*;
- import org.apache.poi.ss.usermodel.*;
- import org.apache.poi.hssf.usermodel.HSSFCell;
- import org.apache.poi.hssf.usermodel.HSSFRow;
- import org.apache.poi.hssf.usermodel.HSSFSheet;
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
- // 导入hssf来处理xls文件
- import org.apache.poi.poifs.filesystem.POIFSFileSystem;
- // 使用poifs来读文件更加的轻松,当然也可以不用
- public class main {
- /**
- * @param args
- */
- public static void main(String[] args) {
- String addr = "/home/ulysess/Developer/T_user.XLS";
- HSSFWorkbook wb = null;
- HSSFSheet contents = null;
- try {
- POIFSFileSystem exlf = new POIFSFileSystem(new FileInputStream(addr));
- wb = new HSSFWorkbook(exlf);
- } catch (FileNotFoundException e) {
- System.out.println("文件不存在,请检查路径");
- e.printStackTrace();
- return;
- } catch (IOException e) {
- System.out.println("读取文件时发生IO错误");
- e.printStackTrace();
- return;
- }
- contents = wb.getSheetAt(0);
- //取第一个sheet
- int minColIdx, maxColIdx, maxRowIdx;
- maxRowIdx = contents.getLastRowNum();
- HSSFRow xlrow = contents.getRow(0);
- //-----------------------建立MySQL连接-------------------------
- try {
- Class.forName("com.mysql.jdbc.Driver");
- //建立一个mysql的driver的实例,并将其注册到DriversManager
- } catch (ClassNotFoundException e) {
- System.out.println("Unable load Driver");
- e.printStackTrace();
- }
- String name = "root";
- String password = "moratorium";
- String url = "jdbc:mysql://localhost/USERDATAS";
- try {
- Connection con = DriverManager.getConnection(url, name, password);
- //建立连接
- Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
- ResultSet.CONCUR_UPDATABLE);
- try {
- /*stmt.execute("create table ORGDATAS( " +
- "USERID VARCHAR(24) NOT NULL PRIMARY KEY," +
- " USERNAME VARCHAR(24), SEX TINYINT, " +
- "PASSWORD VARCHAR(64), USERTYPE TINYINT, " +
- "FREEAUTHEN TINYINT, CERTIFICATETYPE TINYINT, " +
- "CERTIFICATENO VARCHAR(24), EDUCATION TINYINT, " +
- "POSTCODE VARCHAR(10), ADDRESS VARCHAR(128), " +
- "PHONENO VARCHAR(24), BIRTHDAY DATE, EMAIL VARCHAR(64) );");*/
- //建表
- HSSFCell cel, refcell;
- HSSFRow ferr = contents.getRow(1);
- String ctbsql = "create table TARGETTABLE (";
- for(int i = xlrow.getFirstCellNum(); i < xlrow.getLastCellNum(); i++) {
- cel = xlrow.getCell(i);
- refcell = ferr.getCell(i);
- if(refcell == null) {
- ctbsql = ctbsql.concat(cel.getStringCellValue() + " VARCHAR(64)");
- } else {
- switch(refcell.getCellType()) {
- case Cell.CELL_TYPE_FORMULA:
- case Cell.CELL_TYPE_STRING:
- ctbsql = ctbsql.concat(cel.getStringCellValue() + " VARCHAR(64)");
- break;
- case Cell.CELL_TYPE_NUMERIC:
- ctbsql = ctbsql.concat(cel.getStringCellValue() + " INT");
- break;
- case Cell.CELL_TYPE_BOOLEAN:
- ctbsql = ctbsql.concat(cel.getStringCellValue() + " TINYINT");
- break;
- default:
- ctbsql = ctbsql.concat(cel.getStringCellValue() + " VARCHAR(64)");
- }
- }
- if(i < xlrow.getLastCellNum()-1) {
- if(i == 0 ) {
- ctbsql = ctbsql.concat(" NOT NULL PRIMARY KEY");
- }
- ctbsql = ctbsql.concat(", ");
- }else {
- ctbsql = ctbsql.concat(");");
- }
- }
- stmt.execute(ctbsql);
- //跟据前两行的内容来建表
- } catch(SQLException e) {
- }
- ResultSet rs = stmt.executeQuery("select * from TARGETTABLE");
- minColIdx = xlrow.getFirstCellNum();
- maxColIdx = xlrow.getLastCellNum();
- //设定每列的最小最大索引
- int cnt =0 ;
- boolean infirstrow = true;
- //for each式遍历整个表
- for (Row row : contents) {
- if(infirstrow) {
- infirstrow = false;
- continue;
- }
- rs.moveToInsertRow();
- System.out.println("insert " + cnt++);
- for (Cell cell : row) {
- if(cell == null) {
- continue;
- }
- switch(cell.getCellType()) {
- case Cell.CELL_TYPE_FORMULA:
- case Cell.CELL_TYPE_STRING:
- rs.updateString(cell.getColumnIndex() + 1, cell.getStringCellValue());
- break;
- case Cell.CELL_TYPE_NUMERIC:
- rs.updateInt(cell.getColumnIndex() + 1, (int) cell.getNumericCellValue());
- break;
- case Cell.CELL_TYPE_BOOLEAN:
- rs.updateShort(cell.getColumnIndex() + 1, (short) cell.getNumericCellValue());
- break;
- default:
- rs.updateString(cell.getColumnIndex() + 1, cell.getStringCellValue());
- }
- }
- rs.insertRow();
- }
- System.out.println("--------------------------");
- } catch (SQLException e) {
- e.printStackTrace();
- System.out.println("/n--- SQLException caught ---/n");
- while (e != null) {
- System.out.println("Message: "
- + e.getMessage ());
- System.out.println("SQLState: "
- + e.getSQLState ());
- System.out.println("ErrorCode: "
- + e.getErrorCode ());
- e = e.getNextException();
- e.printStackTrace();
- System.out.println("");
- }
- } catch (IllegalStateException ie) {
- ie.printStackTrace();
- }
- }
- }
在项目中用户需要导入大量Excel表格数据到数据库,为此需求自己写了一个读取Excel数据的Java类,现将代码贴出来与大家一起分享。
该类提供两个方法,一个方法用于读取Excel表格的表头,另一个方法用于读取Excel表格的内容。
(注:本类需要POI组件的支持,POI是apache组织下的一个开源组件,)
代码如下:
- package org.hnylj.poi.util;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.Map;
- import org.apache.poi.hssf.usermodel.HSSFCell;
- 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.poifs.filesystem.POIFSFileSystem;
- /**
- * 操作Excel表格的功能类
- * @author:hnylj
- * @version 1.0
- */
- public class ExcelReader {
- private POIFSFileSystem fs;
- private HSSFWorkbook wb;
- private HSSFSheet sheet;
- private HSSFRow row;
- /**
- * 读取Excel表格表头的内容
- * @param InputStream
- * @return String 表头内容的数组
- *
- */
- public String[] readExcelTitle(InputStream is) {
- try {
- fs = new POIFSFileSystem(is);
- wb = new HSSFWorkbook(fs);
- } catch (IOException e) {
- e.printStackTrace();
- }
- sheet = wb.getSheetAt(0);
- row = sheet.getRow(0);
- //标题总列数
- int colNum = row.getPhysicalNumberOfCells();
- String[] title = new String[colNum];
- for (int i=0; i<colNum; i++) {
- title[i] = getStringCellValue(row.getCell((short) i));
- }
- return title;
- }
- /**
- * 读取Excel数据内容
- * @param InputStream
- * @return Map 包含单元格数据内容的Map对象
- */
- public Map<Integer,String> readExcelContent(InputStream is) {
- Map<Integer,String> content = new HashMap<Integer,String>();
- String str = "";
- try {
- fs = new POIFSFileSystem(is);
- wb = new HSSFWorkbook(fs);
- } catch (IOException e) {
- e.printStackTrace();
- }
- sheet = wb.getSheetAt(0);
- //得到总行数
- int rowNum = sheet.getLastRowNum();
- row = sheet.getRow(0);
- int colNum = row.getPhysicalNumberOfCells();
- //正文内容应该从第二行开始,第一行为表头的标题
- for (int i = 1; i <= rowNum; i++) {
- row = sheet.getRow(i);
- int j = 0;
- while (j<colNum) {
- //每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据
- //也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean
- str += getStringCellValue(row.getCell((short) j)).trim() + "-";
- j ++;
- }
- content.put(i, str);
- str = "";
- }
- return content;
- }
- /**
- * 获取单元格数据内容为字符串类型的数据
- * @param cell Excel单元格
- * @return String 单元格数据内容
- */
- private String getStringCellValue(HSSFCell cell) {
- String strCell = "";
- switch (cell.getCellType()) {
- case HSSFCell.CELL_TYPE_STRING:
- strCell = cell.getStringCellValue();
- break;
- case HSSFCell.CELL_TYPE_NUMERIC:
- strCell = String.valueOf(cell.getNumericCellValue());
- break;
- case HSSFCell.CELL_TYPE_BOOLEAN:
- strCell = String.valueOf(cell.getBooleanCellValue());
- break;
- case HSSFCell.CELL_TYPE_BLANK:
- strCell = "";
- break;
- default:
- strCell = "";
- break;
- }
- if (strCell.equals("") || strCell == null) {
- return "";
- }
- if (cell == null) {
- return "";
- }
- return strCell;
- }
- /**
- * 获取单元格数据内容为日期类型的数据
- * @param cell Excel单元格
- * @return String 单元格数据内容
- */
- private String getDateCellValue(HSSFCell cell) {
- String result = "";
- try {
- int cellType = cell.getCellType();
- if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
- Date date = cell.getDateCellValue();
- result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1)
- + "-" + date.getDate();
- } else if (cellType == HSSFCell.CELL_TYPE_STRING) {
- String date = getStringCellValue(cell);
- result = date.replaceAll("[年月]", "-").replace("日", "").trim();
- } else if (cellType == HSSFCell.CELL_TYPE_BLANK) {
- result = "";
- }
- } catch (Exception e) {
- System.out.println("日期格式不正确!");
- e.printStackTrace();
- }
- return result;
- }
- public static void main(String[] args) {
- try {
- //对读取Excel表格标题测试
- InputStream is = new FileInputStream("C:\\Excel表格测试.xls");
- ExcelReader excelReader = new ExcelReader();
- String[] title = excelReader.readExcelTitle(is);
- System.out.println("获得Excel表格的标题:");
- for (String s : title) {
- System.out.print(s + " ");
- }
- //对读取Excel表格内容测试
- InputStream is2 = new FileInputStream("C:\\Excel表格测试.xls");
- Map<Integer,String> map = excelReader.readExcelContent(is2);
- System.out.println("获得Excel表格的内容:");
- for (int i=1; i<=map.size(); i++) {
- System.out.println(map.get(i));
- }
- } catch (FileNotFoundException e) {
- System.out.println("未找到指定路径的文件!");
- e.printStackTrace();
- }
- }
- }

- package org.hnylj.poi.util;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.Map;
- import org.apache.poi.hssf.usermodel.HSSFCell;
- 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.poifs.filesystem.POIFSFileSystem;
- /**
- * 操作Excel表格的功能类
- * @author:hnylj
- * @version 1.0
- */
- public class ExcelReader {
- private POIFSFileSystem fs;
- private HSSFWorkbook wb;
- private HSSFSheet sheet;
- private HSSFRow row;
- /**
- * 读取Excel表格表头的内容
- * @param InputStream
- * @return String 表头内容的数组
- *
- */
- public String[] readExcelTitle(InputStream is) {
- try {
- fs = new POIFSFileSystem(is);
- wb = new HSSFWorkbook(fs);
- } catch (IOException e) {
- e.printStackTrace();
- }
- sheet = wb.getSheetAt(0);
- row = sheet.getRow(0);
- //标题总列数
- int colNum = row.getPhysicalNumberOfCells();
- String[] title = new String[colNum];
- for (int i=0; i<colNum; i++) {
- title[i] = getStringCellValue(row.getCell((short) i));
- }
- return title;
- }
- /**
- * 读取Excel数据内容
- * @param InputStream
- * @return Map 包含单元格数据内容的Map对象
- */
- public Map<Integer,String> readExcelContent(InputStream is) {
- Map<Integer,String> content = new HashMap<Integer,String>();
- String str = "";
- try {
- fs = new POIFSFileSystem(is);
- wb = new HSSFWorkbook(fs);
- } catch (IOException e) {
- e.printStackTrace();
- }
- sheet = wb.getSheetAt(0);
- //得到总行数
- int rowNum = sheet.getLastRowNum();
- row = sheet.getRow(0);
- int colNum = row.getPhysicalNumberOfCells();
- //正文内容应该从第二行开始,第一行为表头的标题
- for (int i = 1; i <= rowNum; i++) {
- row = sheet.getRow(i);
- int j = 0;
- while (j<colNum) {
- //每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据
- //也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean
- str += getStringCellValue(row.getCell((short) j)).trim() + "-";
- j ++;
- }
- content.put(i, str);
- str = "";
- }
- return content;
- }
- /**
- * 获取单元格数据内容为字符串类型的数据
- * @param cell Excel单元格
- * @return String 单元格数据内容
- */
- private String getStringCellValue(HSSFCell cell) {
- String strCell = "";
- switch (cell.getCellType()) {
- case HSSFCell.CELL_TYPE_STRING:
- strCell = cell.getStringCellValue();
- break;
- case HSSFCell.CELL_TYPE_NUMERIC:
- strCell = String.valueOf(cell.getNumericCellValue());
- break;
- case HSSFCell.CELL_TYPE_BOOLEAN:
- strCell = String.valueOf(cell.getBooleanCellValue());
- break;
- case HSSFCell.CELL_TYPE_BLANK:
- strCell = "";
- break;
- default:
- strCell = "";
- break;
- }
- if (strCell.equals("") || strCell == null) {
- return "";
- }
- if (cell == null) {
- return "";
- }
- return strCell;
- }
- /**
- * 获取单元格数据内容为日期类型的数据
- * @param cell Excel单元格
- * @return String 单元格数据内容
- */
- private String getDateCellValue(HSSFCell cell) {
- String result = "";
- try {
- int cellType = cell.getCellType();
- if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
- Date date = cell.getDateCellValue();
- result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1)
- + "-" + date.getDate();
- } else if (cellType == HSSFCell.CELL_TYPE_STRING) {
- String date = getStringCellValue(cell);
- result = date.replaceAll("[年月]", "-").replace("日", "").trim();
- } else if (cellType == HSSFCell.CELL_TYPE_BLANK) {
- result = "";
- }
- } catch (Exception e) {
- System.out.println("日期格式不正确!");
- e.printStackTrace();
- }
- return result;
- }
- public static void main(String[] args) {
- try {
- //对读取Excel表格标题测试
- InputStream is = new FileInputStream("C:\\Excel表格测试.xls");
- ExcelReader excelReader = new ExcelReader();
- String[] title = excelReader.readExcelTitle(is);
- System.out.println("获得Excel表格的标题:");
- for (String s : title) {
- System.out.print(s + " ");
- }
- //对读取Excel表格内容测试
- InputStream is2 = new FileInputStream("C:\\Excel表格测试.xls");
- Map<Integer,String> map = excelReader.readExcelContent(is2);
- System.out.println("获得Excel表格的内容:");
- for (int i=1; i<=map.size(); i++) {
- System.out.println(map.get(i));
- }
- } catch (FileNotFoundException e) {
- System.out.println("未找到指定路径的文件!");
- e.printStackTrace();
- }
- }
- }

通过该类提供的方法就能读取出Excel表格中的数据,数据读取出来了,其他的,对这些数据进行怎样的操作,要靠你另外写程序去实现,因为该类只提供读取Excel表格数据的功能。
说明:在该类中有一个getStringCellValue(HSSFCell cell)方法和一个getDateCellValue(HSSFCell cell)方法,前一个方法用于读取那些为字符串类型的数据,如果你的Excel表格中填写的是日期类型的数据,则你应该在readExcelContent(InputStream is)方法里调用getDateCellValue(HSSFCell cell)方法,因为若调用getStringCellValue(HSSFCell cell)方法读取日期类型的数据将得到的是一个浮点数,这很可能不符合实际要求。
使用JDBC+POI把Excel中的数据导出到MySQL的更多相关文章
- 使用Python将Excel中的数据导入到MySQL
使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...
- POI向Excel中写入数据及追加数据
import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import ...
- 使用OpenXml把Excel中的数据导出到DataSet中
public class OpenXmlHelper { /// <summary> /// 读取Excel数据到DataSet中,默认读取所有Sheet中的数据 /// </sum ...
- 用JDBC把Excel中的数据导入到Mysql数据库中
步骤:0.在Mysql数据库中先建好table 1.从Excel表格读数据 2.用JDBC连接Mysql数据库 3.把读出的数据导入到Mysql数据库的相应表中 其中,步骤0的table我是先在Mys ...
- excel中的数据导出为properties和map的方法
在做项目的过程中,经常需要处理excel数据,特别是和业务人员配合时,业务人员喜欢使用excel处理一些数据,然后交给我们技术人员进行程序处理.利用POI读取写入excel数据,是经常使用的一个情景. ...
- 2019-03-20 用SSIS把Excel中的数据导出来保存到SQLServer中
Control Flow 1.配置 好 图形 2.去变量那 配置好 文件路径 和 存储过程 3.在SQL Server创建对应的存储过程,该存储过程的功能是每次导入是清空原有的数据 4.如果不懂的参考 ...
- Sqoop2 将hdfs中的数据导出到MySQL
1.进入sqoop2终端: [root@master /]# sqoop2 2.为客户端配置服务器: sqoop:000> set server --host master --port 120 ...
- 《sqoop实现hdfs中的数据导出至mysql数据库》
报错Access denied for user 'root'@'localhost' (using password: YES) 参考一 参考二 登陆mysql时,root密码的修改 参考帖子h ...
- Java利用POI导入导出Excel中的数据
首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...
随机推荐
- 原生js--兼容获取窗口滚动条位置和窗口大小的方法
各个浏览器对获取获取窗口滚动条位置和窗口大小没有提供统一的API,以下是对其封装,解决兼容性问题 /** * 获取浏览器视口的大小(显示文档的部分) * */function getViewPort ...
- 应用程序创建自己的奔溃转储(crash dump)文件
1.注册自定义的UnhandledExceptionFilter,C/C++ Runtime Library下需要注意自定义handler被移除(hook kernel32.dll的SetUnhand ...
- 将Linux系统的字体全改成中文
# 修改字符集,否则可能报 input/output error的问题,因为日志里打印了中文 $ localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 $ export ...
- thinkCMF----自定义配置调用
有些时候,需要在后台给网站一些其他的配置: 这个配置,一般都是通过修改代码实现的,ThinkCMF本身没有这个配置: 找到site.html 增加一个Group就可以: 在配置里面做相应的配置就可以:
- Elasticsearch 不同的搜索类型之间的区别
1.match 轻量级搜索 GET /wymlib/_search { "query": { "match": { "title": ...
- DISTINCT 与 GROUP BY 的比较
看了很多文章,这两个SQL语句在不同的数据库上面的实现上可能有相同或有不同,但是应当要明确它们在功能概念上的区别,最终得出结论: GROUP BY 用来使用聚集函数获得值,比如 AVG, MAX, M ...
- url写法细节
- 关于keyGenerator,KeyPairGenerator,SecretKeyFactory的解析
Java加密的常用的加密算法类型有三种 1单向加密:也就是不可逆的加密,例如MD5,SHA,HMAC 2对称加密:也就是加密方和解密方利用同一个秘钥对数据进行加密和解密,例如DES,PBE等等 3非对 ...
- ELKStack生产案例
需求分析: 访问日志:apache访问日志,nginx访问日志,tomcat file 错误日志: error log,java日志 直接收 java异常需要处理 系统日志:/var/log/* ...
- POJ-2777 Count Color(线段树,区间染色问题)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40510 Accepted: 12215 Descrip ...