如题,从excel导入数据到数据库,支持.xls和.xlsx后缀。
用的是poi。
不多说了,具体代码如下:
/** * 上传excel文件 * @param tableId 上传数据到那个表的表id * @return 返回一个对象,包括上传是否成功的状态 * @author zhengjiang * @Time 2016年3月8日 */
@RequestMapping("/uploadExcel/{tableId}")
@ResponseBody
public Object uploadExcel(@PathVariable String tableId){
try{
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
if(multipartResolver.isMultipart(request))
{
MultipartHttpServletRequest multiRequest = multipartResolver.resolveMultipart(request);
Iterator<String> iter = multiRequest.getFileNames();
while (iter.hasNext())
{
int pre = (int) System.currentTimeMillis();
//取得上传文件
MultipartFile file = multiRequest.getFile(iter.next());
if (file != null) {
return this.readExcel(file.getInputStream(), tableId);
}
else
{
return new Object(){public boolean success = false;public String url = "";public String msg = "无法读取文件"; };
}
}
}
return new Object(){public boolean success = false;public String url = "";public String msg = "上传文件失败"; };
}
catch (Exception e) {
return e;
}
}
/** * 把excel文件的数据导入数据库 * @param tableId 上传数据到那个表的表id * @return 返回一个对象,包括上传是否成功的状态 * @author zhengjiang * @Time 2016年3月15日 */
private Object readExcel(InputStream is,String tableId){
try{
String tableName = this.getTableNameByTable(tableId);
HashMap map = this.getTableFieldsByTableId(tableId);
Workbook wb = this.create(is);
Sheet sheet = wb.getSheetAt(0);
//表名不能为空
if(tableName == null || tableName == "")
{
return new Object(){public boolean success = false;public String msg = "找不到当前id下的图层"; };
}
//必须存在xy轴
if(!map.containsKey("x") || !map.containsKey("y"))
{
return new Object(){public boolean success = false;public String msg = "导入数据失败。图层必须包括X、Y轴,而当前图层表结构缺省X、Y轴"; };
}
Iterator<Row> rows = sheet.rowIterator(); //获得第一个表单的迭代器
Row row0 = sheet.getRow(0);
while (rows.hasNext()) {
//获得行数据
//获得行号从0开始
Row row = rows.next();
int rowNum = row.getRowNum();
if(rowNum == 0) continue;
//获得第一行的迭代器
Iterator<Cell> cells = row.cellIterator();
String str = "";
while (cells.hasNext()) {
Cell cell = cells.next();
int colNum = cell.getColumnIndex();
Object object = "";
//根据cell中的类型来输出数据
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC:
//读取数据的时候会把时间当数字,要再判断一下类型
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date d = cell.getDateCellValue();
long dd = d.getTime();
object = map.get(row0.getCell(colNum).getStringCellValue()) + ":{$date:" + dd + "}" ;
}else {
object = map.get(row0.getCell(colNum).getStringCellValue()) + ":" + cell.getNumericCellValue();
}
break;
case HSSFCell.CELL_TYPE_STRING:
object = map.get(row0.getCell(colNum).getStringCellValue()) + ":\"" + cell.getStringCellValue()+"\"";
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
object = map.get(row0.getCell(colNum).getStringCellValue()) + ":" + cell.getBooleanCellValue();
break;
case HSSFCell.CELL_TYPE_FORMULA:
object = map.get(row0.getCell(colNum).getStringCellValue()) + ":" + cell.getCellFormula();
break;
default:
System.out.println("unsuported sell type");
break;
}
if(str == ""){
str = object.toString();
}else {
str += "," + object;
}
}
//数据库具体操作
data d = new data();
str = "{" + str + "}";
HttpSession session = request.getSession();
if(session.getAttribute("loginUserName") == null) return null;
String loginUserName = session.getAttribute("loginUserName") + "";
d.Insert(tableName,str,loginUserName);
}
return new Object(){public boolean success = true;public String msg = "数据上传完成"; };
}
catch (Exception ex){
return new Object(){public boolean success = false;public String msg = ex.getMessage(); };
}
}
/** * 根据表id获取表名 * @param tableId 上传数据到那个表的表id * @return 表名 * @author zhengjiang * @Time 2016年3月15日 */
private String getTableNameByTable(String tableId) {
data d = new data();
String sqlStr = "{\"_id\":{\"$oid\":\"" + tableId + "\"}}";
return d.getTableColumnByTableId("collectionList",sqlStr,"name").toString();
}
/** * 不同的文件格式创建不同的Workbook * @param inp 输入数据流 * @return Workbook对象 * @author zhengjiang * @Time 2016年3月15日 */
private static Workbook create(InputStream inp) throws IOException,InvalidFormatException {
if (!inp.markSupported()) {
inp = new PushbackInputStream(inp, 8);
}
//.xls
if (POIFSFileSystem.hasPOIFSHeader(inp)) {
return new HSSFWorkbook(inp);
}
//.xlsx
if (POIXMLDocument.hasOOXMLHeader(inp)) {
return new XSSFWorkbook(OPCPackage.open(inp));
}
throw new IllegalArgumentException("你的excel版本目前poi解析不了");
}
/** * 创建以图层字段别名为key,字段名为value的键值对 * @param tableId 表id * @return 键值对 * @author zhengjiang * @Time 2016年3月21日 */
private HashMap getTableFieldsByTableId(String tableId)
{
HashMap map = new HashMap();
map.put("x","x");
map.put("y","y");
data d = new data();
String sqlStr = "{\"_id\":{\"$oid\":\"" + tableId + "\"}}";
//调用data的getTableColumnByTableId获取表结构的字段信息,因为他是一个对象,所以可以直接转成Document对象
Document doc = (Document)d.getTableColumnByTableId("collectionList",sqlStr,"fieldInfo");
//因为字段信息的字段列表是一个Document类型的集合,所以直接构造一个ArrayList<Document>
ArrayList<Document> docs = new ArrayList<Document>(doc.get("fields",List.class));
for (Document document:docs) {
map.put(document.get("alias"),document.get("name"));
}
return map;
}