java写excel文件后缀名不对怎么解决?java如何导入excel?

开发人员在写入excel文件的时候,总是会提示后缀名不对,尝试了很多种方法也无法解决,这可急坏了Java人员,那java写excel文件后缀名不对怎么解决?下面来我们就来给大家讲解一下。

把eclipse的vm arguments设置修改为:-Xms256M -Xmx768M。

java如何导入excel?

一、思路是这样的:

1.先做好一个Excel模板供用户下载,例如下图

java写excel文件后缀名不对怎么解决?java如何导入excel?.png

2.用户使用模板填好数据,上传Excel文件到web后台,后台接收文件。

3.把用户上传的文件进行校验文件格式、字段是否符合要求,符合要求则解析数据,保存到数据库中,不符合要求则提示;

二、代码实现

1.要导入的数据JAVA对象如下:

public class Rfid extends BaseEntity
{
    //名称
    private String name;
    //藏品类别
    private String rfidTypeId;
    //藏品类别名称
    private String rfidTypeName;
    //藏品分类
    private String typeName;
    //藏品年代
    private String age;
    //设计师
    private String stylist;
    //品牌
    private String brand;
    //国家地区
    private String contriesRegions;
    //材质
    private String texture;
    //工艺
    private String technology;
    //尺寸
    private String measure;
    //颜色
    private String colour;
    //入藏时间
    private Date enterTime;
    //包含藏品数量
    private Integer rfidCout;
    //藏品来源
    private String source;
    //馆藏状态
    private Integer rfidState = 0;
    //关键词
    private String keyword;
    //曾被引用
    private String quote;
    //关联藏品
    @Transient
    private String relevance;
    //保险
    private String insurance;
    //藏品编号
    private String typeNumber;
    //出入库状态
    private Integer status = 0;
    //仓库位置信息
    private String locationInformation;
    //描述
    private String description;
    //省略get、set方法
}

2. Excel表格导入后,处理代码如下

/**
 * 读取出filePath中的所有数据信息
 * @param filePath filePath excel文件的绝对路径
 * @param cellNameList 要读取的对应表头名
 * @return
 */
public static List < String[] > getDataFromExcel(String filePath, List < String > cellNameList) throws Exception
{
    List < String[] > resultList = new ArrayList < > ();
    //判断是否为excel类型文件
    if (!filePath.endsWith(".xls") && !filePath.endsWith(".xlsx"))
    {
        throw new BaseException("文件不是excel类型");
    }
    FileInputStream fis = null;
    Workbook wookbook = null;
    int flag = 0;
    try
    {
        //获取一个绝对地址的流
        fis = new FileInputStream(filePath);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    try
    {
        //2003版本的excel,用.xls结尾
        wookbook = new HSSFWorkbook(fis); //得到工作簿
    }
    catch (Exception ex)
    {
        try
        {
            //2007版本的excel,用.xlsx结尾
            fis = new FileInputStream(filePath);
            wookbook = new XSSFWorkbook(fis); //得到工作簿
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    //得到一个工作表
    Sheet sheet = wookbook.getSheetAt(0);
    //获得表头
    Row rowHead = sheet.getRow(0);
    //根据不同的data放置不同的表头
    /* Set<String> headSet = new HashSet<>();*/
    //判断表头列数是否与预期的列数一致
    if (rowHead.getPhysicalNumberOfCells() != cellNameList.size())
    {
        throw new BaseException("表头列数与要导入的数据库不对应");
    }
    //判断表头与预期数据是否相符
    while (flag < cellNameList.size())
    {
        Cell cell = rowHead.getCell(flag);
        String cellName = cellNameList.get(flag);
        if (getRightTypeCell(cell)
            .equals(cellName))
        {
            //headSet.add(cellName);
        }
        else
        {
            throw new BaseException("表头[" + getRightTypeCell(cell) + "]不合规范,请修改后重新导入");
        }
        flag++;
    }
    /*if(headSet.size()!= cellNameList.size()){
        throw new BaseException("表头不合规范,请修改后重新导入");
    }*/
    //获得数据的总行数
    int totalRowNum = sheet.getLastRowNum();
    if (0 == totalRowNum)
    {
        throw new BaseException("Excel内没有数据");
    }
    //要获得属性
    String name = "";
    //获得所有数据
    for (int i = 1; i <= totalRowNum; i++)
    {
        //获得第i行对象
        Row row = sheet.getRow(i);
        String[] cells = new String[cellNameList.size()];
        for (int j = 0; j < cellNameList.size(); j++)
        {
            name = (String) getRightTypeCell(row.getCell(j));
            cells[j] = name;
        }
        resultList.add(cells);
    }
    return resultList;
}
/**
 * 把EXCEL Cell原有数据转换成String类型
 * @param cell 一个单元格的对象
 * @return 返回该单元格相应的类型的值
 */
public static String getRightTypeCell(Cell cell)
{
    if (cell == null) return "";
    String cellSring = "";
    switch (cell.getCellType())
    {
    case HSSFCell.CELL_TYPE_STRING: // 字符串
        cellSring = cell.getStringCellValue();
        break;
    case HSSFCell.CELL_TYPE_NUMERIC: // 数字
        if (HSSFDateUtil.isCellDateFormatted(cell))
        {
            //用于转化为日期格式
            Date d = cell.getDateCellValue();
            DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
            cellSring = formater.format(d);
        }
        else
        {
            // 用于格式化数字,只保留数字的整数部分
            DecimalFormat df = new DecimalFormat("########");
            cellSring = df.format(cell.getNumericCellValue());
        }
        //cellSring=String.valueOf(cell.getNumericCellValue());
        break;
    case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
        cellSring = String.valueOf(cell.getBooleanCellValue());
        break;
    case HSSFCell.CELL_TYPE_FORMULA: // 公式
        cellSring = String.valueOf(cell.getCellFormula());
        break;
    case HSSFCell.CELL_TYPE_BLANK: // 空值
        cellSring = "";
        break;
    case HSSFCell.CELL_TYPE_ERROR: // 故障
        cellSring = "";
        break;
    default:
        cellSring = "ERROR";
        break;
    }
    return cellSring;
}

3. 业务逻辑即Service层,代码如下

/**
 * 批量导入藏品
 * @param file
 * @return
 * @throws Exception
 */
public List < Rfid > importRfid(MultipartFile file) throws Exception
{
    List < Rfid > resultList = new ArrayList < > ();
    String origName = file.getOriginalFilename();
    String name = FilesService.trimExt(origName);
    String ext = FilesService.getExt(origName);
    if (ext != null)
    {
        ext = ext.toLowerCase();
    }
    String fileName = name + "_" + filesService.generateFileName(new Date());
    String fullPath = uploadPathHelper.getRootPath() + uploadPathHelper.getFilePath() + fileName;
    File f = new File(uploadPathHelper.getRootPath() + uploadPathHelper.getFilePath());
    if (!f.exists())
    {
        f.mkdirs();
    }
    String url = fullPath + "." + ext;
    File f1 = new File(url);
    f1.createNewFile();
    file.transferTo(f1);
    List < String[] > resultString = excelUtil.getDataFromExcel(url, this.getCellNameList());
    resultString.forEach(rfidArray - >
    {
        Rfid rfid = new Rfid();
        rfid.setName(rfidArray[0]);
        rfid.setRfidTypeId(rfidArray[1]);
        rfid.setRfidTypeName(rfidArray[2]);
        rfid.setTypeName(rfidArray[3]);
        rfid.setAge(rfidArray[4]);
        rfid.setStylist(rfidArray[5]);
        rfid.setBrand(rfidArray[6]);
        rfid.setContriesRegions(rfidArray[7]);
        rfid.setTexture(rfidArray[8]);
        rfid.setTechnology(rfidArray[9]);
        rfid.setMeasure(rfidArray[10]);
        rfid.setColour(rfidArray[11]);
        rfid.setEnterTime(TimeUtil.getDate(rfidArray[12]));
        if (rfidArray[13] != null)
            rfid.setRfidCout(Integer.parseInt(rfidArray[13]));
        rfid.setSource(rfidArray[14]);
        rfid.setKeyword(rfidArray[15]);
        rfid.setLocationInformation(rfidArray[16]);
        rfid.setDescription(rfidArray[17]);
        try
        {
            resultList.add(this.save(rfid, null));
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    });
    //导入完成,删除导入文件
    File delExt = new File(url);
    if (delExt.exists())
    {
        delExt.delete();
    }
    return resultList;
}
/**
 *要导入Excel字段名称
 *
 **/
public List < String > getCellNameList()
{
    //导入藏品的字段名称
    List < String > cellNameList = new ArrayList < > ();
    cellNameList.add("名称");
    cellNameList.add("藏品类别");
    cellNameList.add("藏品类别名称");
    cellNameList.add("藏品分类");
    cellNameList.add("藏品年代");
    cellNameList.add("设计师");
    cellNameList.add("品牌");
    cellNameList.add("国家地区");
    cellNameList.add("材质");
    cellNameList.add("工艺");
    cellNameList.add("尺寸");
    cellNameList.add("颜色");
    cellNameList.add("入藏时间");
    cellNameList.add("包含藏品数量");
    cellNameList.add("藏品来源");
    cellNameList.add("关键词");
    cellNameList.add("仓库位置信息");
    cellNameList.add("描述");
    return cellNameList;
}

4. 控制层代码

@ResponseBody
@PostMapping("importRfid")
public String importRfid(MultipartFile file) throws Exception
{
    return Result.succeedResultByMsgAndDate("藏品导入成功", rfidService.importRfid(file));
}

到这里Excel批量导入数据就完成了,java写入Excel是开发人员必备的技能,因此我们可以尝试自己开发一下,如果遇到不会的,可以参考实例教程哦!最后大家如果想要了解更多java实例知识,敬请关注奇Q工具网。

推荐阅读:

springmvc工作原理及其流程是什么?相关介绍

java工程师必备技能有哪些?java工程师工资为什么高?

jquery怎么解决跨域?jquery跨域原理是什么?