使用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包的下载地 ...
随机推荐
- Elasticsearch学习之快速入门案例
1. document数据格式 面向文档的搜索分析引擎 (1)应用系统的数据结构都是面向对象的,复杂的(2)对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原回对象格式,相 ...
- C#中XML的读取
本文主要介绍在C#中有关XML的读取,写入操作. 1.XML的内容如下: <?xml version="1.0" encoding="utf-8" ?&g ...
- Centos 7网络文件系统nfs服务的安装与配置
实验环境>>>>>>>>> nfs服务端:(nfs-server)192.168.100.2 nfs客户端:(nfs-client)192.168 ...
- [工具] 知网(CNKI)文献下载工具
https://github.com/amyhaber/cnki-downloader 用于免费搜索,下载CNKI上的各类文献资料
- Docker学习计划三:Dockerfile 使用
我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dockerfile 是镜像和容器的关键,Dockerfile 可以非常容易的定义镜像内容 首先通过一张图来了解 Docker 镜像 ...
- 初次使用visual studio
之前一直听闻VS是世界上最强IDE,但是害怕他的体积庞大,一直不敢使用.我一直喜欢轻便简洁的东西,编译器也是一样,所以刚开始我使用的是C-FREE5,虽然界面略显粗糙,和低调奢华有内涵的VS比起来,真 ...
- LCA最近公共祖先(least common ancestors)
#include"stdio.h" #include"string.h" #include"iostream" #include" ...
- php中调用这个功能可以在web页面中显示hello world这个经典单词
php程序写的时间长了,自然对他所提供的功能了如指掌,他所提供的一大堆功能,真是觉得很好用,但有时候会发现php也缺少一些功能,自己总是会产生为php添加一些自定义的功能的想法.久而久之,终于今天憋不 ...
- c++中system("pause")的作用和含义
简单来说就是暂停的意思,一般在LINUX编程时会用到,等待接收信号,才会重新运行 . 在进行C/C++编程的时候,在运行程序查看输出效果时,会出现窗口闪一下就关闭的情况. 在C语言中一般通过添加get ...
- MySQL 重做日志文件
一.innodb log的基础知识 · innodb log顾名思义:即innodb存储引擎产生的日志,也可以称为重做日志文件,默认在innodb_data_home_dir下面有两个文件ib_log ...