使用poi进行导入导出excel是我们开发中常见的应用场景!
导入必要的jar包
创建读取excel的工具类–ExcelUtils
public class ExcelUtils {
/**
* 读取excel文件
*
* @param in
* @param
* @return
* @throws Exception
*/
public static List<LineDownOrder> getBankListByExcel(InputStream in) throws Exception {
List<LineDownOrder> lineDownOrders = new ArrayList<>();
//创建Excel工作薄
Workbook work = getWorkbook(in);
if (null == work) {
throw new Exception("创建Excel工作薄为空!");
}
Sheet sheet = null;
Row row = null;
Cell cell = null;
//遍历Excel中所有的sheet
for (int i = 0; i < work.getNumberOfSheets(); i++) {
sheet = work.getSheetAt(i);
if (sheet == null) {
continue;
}
//遍历当前sheet中的所有行
for (int j =1; j <= sheet.getLastRowNum(); j++) {
row = sheet.getRow(j);
if (row == null ) {
continue;
}
LineDownOrder lineDownOrder = new LineDownOrder();
//把每个单元格的值付给对象的对应属性
if (row.getCell(0)!=null){
lineDownOrder.setInsureNo(String.valueOf(getCellValue(row.getCell(0))));
}
if (row.getCell(1)!=null){
lineDownOrder.setPayMoney(String.valueOf(getCellValue(row.getCell(1))));
}
if (row.getCell(2)!=null){
lineDownOrder.setPayType(String.valueOf(getCellValue(row.getCell(2))));
}
if (row.getCell(3)!=null){
lineDownOrder.setRepaymentPerson(String.valueOf(getCellValue(row.getCell(3))));
}
if (row.getCell(4)!=null){
lineDownOrder.setRepaymentType(String.valueOf(getCellValue(row.getCell(4))));
}
if (row.getCell(5)!=null){
lineDownOrder.setPayTime(String.valueOf(getCellValue(row.getCell(5))));
}
if (row.getCell(6)!=null){
lineDownOrder.setTradeNo(String.valueOf(getCellValue(row.getCell(6))));
}
//遍历所有的列(把每一行的内容存放到对象中)
lineDownOrders.add(lineDownOrder);
}
}
return lineDownOrders;
}
/**
*
* @param inStr
* @return
* @throws Exception
*/
public static Workbook getWorkbook(InputStream inStr) throws Exception {
Workbook wb = null;
wb = WorkbookFactory.create(inStr);
return wb;
}
/**
* 描述:对表格中数值进行格式化
*
* @param cell
* @return
*/
public static Object getCellValue(Cell cell) {
Object value = null;
DecimalFormat df = new DecimalFormat("0"); //格式化number String字符
SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd"); //日期格式化
DecimalFormat df2 = new DecimalFormat("0.00"); //格式化数字
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
value = cell.getRichStringCellValue().getString();
break;
case Cell.CELL_TYPE_NUMERIC:
if ("General".equals(cell.getCellStyle().getDataFormatString())) {
value = df.format(cell.getNumericCellValue());
} else if ("m/d/yy".equals(cell.getCellStyle().getDataFormatString())) {
value = sdf.format(cell.getDateCellValue());
} else {
value = df2.format(cell.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_BOOLEAN:
value = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_BLANK:
value = "";
break;
default:
break;
}
return value;
}
}
注意:上面我写的这个不是通用的,只是针对于我做的一个excel模版来读取的,把读取到的值赋值到实体bean里,然后放入到,集合。之后传到业务层,根据里面的字段来更新数据库一些表的状态,信息。我这里的应用场景比较简单,就采用了这种方法。
使用WorkbookFactory来创建工作薄,同时兼容excel的.xls以及.xlsx格式。
wook: 工作薄,其实就是一个excel文件。
sheet: 工作表,一个excel可能有多个表。
Row: 列,每一列。
cell: 单元格。excel的最小单位。 .
在读取的时候可以把每一行看作一个实体bean,在遍历行的时候进行赋值。之后放入集合中。
上传的页面比较简单,一个标准的上传标签。
<form id="uploadForm" enctype="multipart/form-data" action="#">
<table>
<tr>
<td style="width: 10%">
<input class="file" id="upfile" type="file" name="upfile"/>
</td>
</tr>
<tr>
<td style="width: 15%">
<input class="btn btn-primary btn-md" type="button" value="导入" id="upLoadPayerCreditInfoExcel"
name="btn"/>
</td>
</tr>
</table>
</form>
我这里使用ajax请求传递文件
<script type="text/javascript">
// <![CDATA[
$('#upLoadPayerCreditInfoExcel').click(function () {
if (checkData()) {
var formData = new FormData();
formData.append("upfile", document.getElementById("upfile").files[0]);
$.ajax({
url: ,
type: "post",
data: formData,
contentType: false,
processData: false,
success: function (data) {
alert(data.status);
},
});
}
});
//JS校验form表单信息
function checkData() {
var fileDir = $("#upfile").val();
var suffix = fileDir.substr(fileDir.lastIndexOf("."));
if ("" == fileDir) {
alert("选择需要导入的Excel文件!");
return false;
}
if (".xls" != suffix && ".xlsx" != suffix) {
alert("选择Excel格式的文件导入!");
return false;
}
return true;
}
// ]]>
</script>
后台controller层可以用 MultipartFile来接收文件。
/**
* 读取excel更新数据
*
* @param upfile
* @param
* @param
* @throws Exception
*/
@RequestMapping(value = "/readExcel")
@Transactional
public Map<String, String> readExcel(MultipartFile upfile) throws Exception {
HashMap<String, String> map = new HashMap<>();
InputStream in = upfile.getInputStream();
//读取excel中的内容
List<LineDownOrder> lineDownOrders = ExcelUtils.getBankListByExcel(in);
String s = orderService.updateByExcel(lineDownOrders);
map.put("status", s);
return map;
}
最后,在这里温馨提示大家,excel里面的数据格式调整为文本比较好,这样都会以string类型去读取,后台代码比较好控制。