使用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包的下载地 ...
随机推荐
- String 类实现 以及>> <<流插入/流提取运算符重载
简单版的String类,旨在说明>> <<重载 #include <iostream> //#include <cstring>//包含char*的字符 ...
- 原生js--异步请求
1.异步请求的方法: iframe.script.XMLHttpRequest.comet(服务器端发起) 2.XMLHttpRequest request = new XMLHttpRequest( ...
- SharpGL学习笔记(一) 平台构建与Opengl的hello World
(一)平台构建与Opengl的hello World OpenGL就是3d绘图的API,微软针和它竞争推出D3D,也就是玩游戏时最常见的DirectorX组件中的3d功能. 所以不要指望windows ...
- C# 输出带颜色文字,用于实时日志输出
private void button1_Click(object sender, EventArgs e) { LogMessage("绿色"); 4 LogError(&quo ...
- C语言程序设计--字符串与指针及数组与指针
数组的基本知识 数组的定义 #define SIZE 5 int array_int[5]; //未声明初始化,默认填零 float array_float[5] = {1.01, 2.23, 3.1 ...
- vue-resource使用 (vue仿百度搜索)
1.this.$http.get()方法2.this.$http.post()方法3.this.$http.jsonp()方法 (vue仿百度搜索) 在输入框中输入a, 然后在百度f12 ==> ...
- html to openxml
Html to OpenXml How to start ? Create a new console application. Add a reference to DocumentFormat.O ...
- CentOS 6.8下更改Apache默认网站安装目录
首先,当我们搭建好LAMP环境后,Apache服务器默认的网站安装目录是/var/www/html 然而我们搭建项目时为了方便,我们是按照自己的意愿更改网站目录的 现在假设,按照意愿设定的网站目录为/ ...
- 关于Django的序列化
阅读目录 Django支持的序列化格式 Django的序列化 Django支持的序列化格式 1 2 3 4 Identifier Information xml Serializes to and f ...
- SharePoint 2013 字段属性之JSLink
在SharePoint 2013中,SPField新增加了一个属性是JSLink,使用客户端脚本修改字段前台展示,我们可以用很多方法修改这个脚本的引用,然后来修改脚本,下面,我们举一个简单的例子. 具 ...