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组织下的一个开源组件,)
代码如下:
Java代码
- 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();
- }
- }
- }
Java代码
- 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组织下的一个开源组件,)
代码如下:
Java代码
- 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();
- }
- }
- }
Java代码
- 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)方法读取日期类型的数据将得到的是一个浮点数,这很可能不符合实际要求。