您的位置:首页 > 数据库 > MySQL

POI往Mysql中,导入导出Excel

2014-12-13 12:10 435 查看
转载:/article/8799867.html

1.导入相应的poi jar包,我用的是3.7;

2.导入Excel文件到数据的类(这里我把解析Excel文件的操作封装成一个类,在action中只要调用该类就可以了):

HSSF - 提供读写Microsoft Excel格式档案的功能。

XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。OOXML是由微软公司为Office
2007产品开发的技术规范,现已成为国际文档格式标准,兼容前国际标准开放文档格式和中国文档标准“标文通”(外语简称:UOF)。于2006年12月成为ECMA标准。

HWPF - 提供读写Microsoft Word格式档案的功能。

HSLF - 提供读写Microsoft PowerPoint格式档案的功能。

HDGF - 提供读写Microsoft Visio格式档案的功能。

Java代码

/**

* POI:解析Excel文件中的数据并把每行数据封装成一个实体

* @param fis 文件输入流

* @return List<EmployeeInfo> Excel中数据封装实体的集合

*/

public static List<EmployeeInfo> importEmployeeByPoi(InputStream fis) {

List<EmployeeInfo> infos = new ArrayList<EmployeeInfo>();

EmployeeInfo employeeInfo = null;

try {

//创建Excel工作薄
我使用的是XSSFWorkbook

HSSFWorkbook hwb = new HSSFWorkbook(fis);

//得到第一个工作表

HSSFSheet sheet = hwb.getSheetAt(0);

HSSFRow row = null;

//日期格式化

DateFormat ft = new SimpleDateFormat("yyyy-MM-dd");

//遍历该表格中所有的工作表,i表示工作表的数量 getNumberOfSheets表示工作表的总数

for(int i = 0; i < hwb.getNumberOfSheets(); i++) {

sheet = hwb.getSheetAt(i);

//遍历该行所有的行,j表示行数 getPhysicalNumberOfRows行的总数

for(int j = 1; j < sheet.getPhysicalNumberOfRows(); j++) {

row = sheet.getRow(j);

employeeInfo = new EmployeeInfo();

/*此方法规定Excel文件中的数据必须为文本格式,所以在解析数据的时候未进行判断

//方法1:Excel解析出来的数字为double类型,要转化为Long类型必须做相应的处理(一开始用的方法,比较笨。)

//先把解析出来的double类型转化为String类型,然后截取String类型'.'以前的字符串,最后把字符串转化为Long类型。

String orgId = row.getCell(0).toString();

String orgId1 = orgId.substring(0, orgId.indexOf('.'));

//方法2:其实double类型可以通过(long)Double这样直接转化为Long类型。

employeeInfo.setOrgId((long)(row.getCell(0).getNumericCellValue()));

employeeInfo.setEmployeeNumber(row.getCell(1).toString());

employeeInfo.setFullName(row.getCell(2).toString());

employeeInfo.setSex(row.getCell(3).toString());

if(row.getCell(4) != null) {

try {

employeeInfo.setDateOfBirth(ft.parse(row.getCell(4).toString()));

} catch (ParseException e) {

e.printStackTrace();

}

}

employeeInfo.setTownOfBirth(row.getCell(5).toString());

employeeInfo.setNationalIdentifier(row.getCell(6).toString());*/

//此方法调用getCellValue(HSSFCell cell)对解析出来的数据进行判断,并做相应的处理

if(ImportEmployee.getCellValue(row.getCell(0)) != null && !"".equals(ImportEmployee.getCellValue(row.getCell(0)))) {

employeeInfo.setOrgId(Long.valueOf(ImportEmployee.getCellValue(row.getCell(0))));

}

employeeInfo.setEmployeeNumber(ImportEmployee.getCellValue(row.getCell(1)));

employeeInfo.setFullName(ImportEmployee.getCellValue(row.getCell(2)));

employeeInfo.setSex(ImportEmployee.getCellValue(row.getCell(3)));

if(ImportEmployee.getCellValue(row.getCell(4)) != null && !"".equals(ImportEmployee.getCellValue(row.getCell(4)))) {

try {

employeeInfo.setDateOfBirth(ft.parse(ImportEmployee.getCellValue(row.getCell(4))));

} catch (ParseException e) {

e.printStackTrace();

}

employeeInfo.setTownOfBirth(ImportEmployee.getCellValue(row.getCell(5)));

}

employeeInfo.setNationalIdentifier(ImportEmployee.getCellValue(row.getCell(6)));

infos.add(employeeInfo);

}

}

} catch (IOException e) {

e.printStackTrace();

}

return infos;

}

//判断从Excel文件中解析出来数据的格式

private static String getCellValue(HSSFCell cell){

String value = null;

//简单的查检列类型

switch(cell.getCellType())

{

case HSSFCell.CELL_TYPE_STRING://字符串

value = cell.getRichStringCellValue().getString();

break;

case HSSFCell.CELL_TYPE_NUMERIC://数字

long dd = (long)cell.getNumericCellValue();

value = dd+"";

break;

case HSSFCell.CELL_TYPE_BLANK:

value = "";

break;

case HSSFCell.CELL_TYPE_FORMULA:

value = String.valueOf(cell.getCellFormula());

break;

case HSSFCell.CELL_TYPE_BOOLEAN://boolean型值

value = String.valueOf(cell.getBooleanCellValue());

break;

case HSSFCell.CELL_TYPE_ERROR:

value = String.valueOf(cell.getErrorCellValue());

break;

default:

break;

}

return value;

}

action中的写法:

因为是做练习,只是熟悉它的用法,这里做的比较简单。

Java代码







//从页面接收参数:文件的路径

String excelPath = request.getParameter("excelPath");

//输入流

InputStream fis = new FileInputStream(excelPath);

//JXL:得到解析Excel的实体集合

// List<EmployeeInfo> infos = ImportEmployee.importEmployee(fis);

//POI:得到解析Excel的实体集合

List<EmployeeInfo> infos = ImportEmployee.importEmployeeByPoi(fis);

//遍历解析Excel的实体集合

for(EmployeeInfo info:infos) {

//判断员工编号是否存在(存在:做修改操作;不存在:做新增操作)

EmployeeInfo info1 = this.selectEmpByEmpNum(info.getEmployeeNumber());

if(info1 == null) {

//把实体新加到数据库中

this.service.addEmployeeInfo(info);

}else{

//把personId封装到实体

info.setPersonId(info1.getPersonId());

//更新实体

this.updatEmployeeInfo(info);

}

}

//关闭流

fis.close();

为了整个导入的完整性,最后附上jsp页面的代码:

Java代码







<input type="file" id="excelPath" name="excelPath"/>  

<input type="button" value="导入Excel" onclick="importEmp()"/>

-----------------------JS对导入的文件做简单的判断------------------------

//Excel文件导入到数据库中

function importEmp(){

//检验导入的文件是否为Excel文件

var excelPath = document.getElementById("excelPath").value;

if(excelPath == null || excelPath == ''){

alert("请选择要上传的Excel文件");

return;

}else{

var fileExtend = excelPath.substring(excelPath.lastIndexOf('.')).toLowerCase();

if(fileExtend == '.xls'){

}else{

alert("文件格式需为'.xls'格式");

return;

}

}

//提交表单

document.getElementById("empForm").action="<%=request.getContextPath()%>/EmpExcel.action.EmpExcelAction.do?method=importEmployeeInfos";

document.getElementById("empForm").submit();

}

3.导出为Excel文件:

Java代码







/**

* POI : 导出数据,存放于Excel中

* @param os 输出流 (action: OutputStream os = response.getOutputStream();)

* @param employeeInfos 要导出的数据集合

*/

public static void exportEmployeeByPoi(OutputStream os, List<EmployeeInfo> employeeInfos) {

try {

//创建Excel工作薄

HSSFWorkbook book = new HSSFWorkbook();

//在Excel工作薄中建一张工作表

HSSFSheet sheet = book.createSheet("员工信息");

//设置单元格格式(文本)

//HSSFCellStyle cellStyle = book.createCellStyle();

//第一行为标题行

HSSFRow row = sheet.createRow(0);//创建第一行

HSSFCell cell0 = row.createCell(0);

HSSFCell cell1 = row.createCell(1);

HSSFCell cell2 = row.createCell(2);

HSSFCell cell3 = row.createCell(3);

HSSFCell cell4 = row.createCell(4);

//定义单元格为字符串类型

cell0.setCellType(HSSFCell.CELL_TYPE_STRING);

cell1.setCellType(HSSFCell.CELL_TYPE_STRING);

cell2.setCellType(HSSFCell.CELL_TYPE_STRING);

cell3.setCellType(HSSFCell.CELL_TYPE_STRING);

cell4.setCellType(HSSFCell.CELL_TYPE_STRING);

//在单元格中输入数据

cell0.setCellValue("员工编号");

cell1.setCellValue("员工姓名");

cell2.setCellValue("员工性别");

cell3.setCellValue("出生日期");

cell4.setCellValue("身份证号");

//循环导出数据到excel中

for(int i = 0; i < employeeInfos.size(); i++) {

EmployeeInfo employeeInfo = employeeInfos.get(i);

//创建第i行

HSSFRow rowi = sheet.createRow(i + 1);

//在第i行的相应列中加入相应的数据

rowi.createCell(0).setCellValue(employeeInfo.getEmployeeNumber());

rowi.createCell(1).setCellValue(employeeInfo.getFullName());

//处理性别(M:男 F:女)

String sex = null;

if("M".equals(employeeInfo.getSex())) {

sex = "男";

}else {

sex = "女";

}

rowi.createCell(2).setCellValue(sex);

//对日期的处理

if(employeeInfo.getDateOfBirth() != null && !"".equals(employeeInfo.getDateOfBirth())){

java.text.DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");

rowi.createCell(3).setCellValue(format1.format(employeeInfo.getDateOfBirth()));

}

rowi.createCell(4).setCellValue(employeeInfo.getNationalIdentifier());

}

//写入数据 把相应的Excel 工作簿存盘

book.write(os);

} catch (IOException e) {

e.printStackTrace();

}

}

除第二个,其它都未POI导入工程的文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: