Java通过不同的方式上传Excel文档
Posted TGB-Earnest
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java通过不同的方式上传Excel文档相关的知识,希望对你有一定的参考价值。
说明
有时候我们需要上传文档,然后解析文档进行业务逻辑的处理,再存储到数据库中,如何读取文档的形式很多,接下来我们来一 一解析。
对比
(1)POI
首先我们引入相关的依赖
<!--poi-ooxml-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
我们需要用 MultipartFile[] file 来进行接受Excel
MultipartFile工具类
MultipartFile是SpringMVC提供简化上传操作的工具类。
在不使用框架之前,都是使用原生的HttpServletRequest来接收上传的数据,文件是以二进制流传递到后端的,然后需要我们自己转换成File类。使用MultipartFile工具类之后,我们对文件上传的操作就简单多了。
public interface MultipartFile
//参数名称
String getName();
//源文件的名称
String getOriginalFilename();
//返回文件的内容类型
String getContentType();
//判断是否为空,或者上传的文件是否有内容
boolean isEmpty();
//返回文件大小,以字节为单位
long getSize();
//将文件内容转成byte[]返回
byte[] getBytes() throws IOException;
//返回InputStream读取文件的内容
InputStream getInputStream() throws IOException;
//用来把MultipartFile转换成File
void transferTo(File var1) throws IOException, IllegalStateException;
知道了MultipartFile的类方法,我们就可以对文件进行操作了。
//文件类型
String filetype = "";
//文件名称
String fileName = "";
if(myfile.getOriginalFilename() != null && !"".equals(myfile.getOriginalFilename()))
filetype = myfile.getOriginalFilename().substring(myfile.getOriginalFilename().indexOf(".") + 1,myfile.getOriginalFilename().length());
fileName = myfile.getOriginalFilename().substring(0,myfile.getOriginalFilename().indexOf("."));
//判断文件格式是否正确
if (!"xls".equals(filetype) && !"xlsx".equals(filetype))
model.put("message", "请选择正确的Excel文件上传!");
return b(request, model, null);
if("xls".equals(filetype))
a = ExcelUtilForBaidu.readExcel2003ZhitouAppKeyword(inputStream,username);
else
a = ExcelUtilForBaidu.readExcel2007ZhitouAppKeyword(inputStream,username);
然后我们将inputStream进行转换
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
然后我们以InputStream的形式传入,读取Excel文件的内容。
写在最前面: 使用的是JAVA POI实现的导出Excel; POI 提供了对2003版本的Excel的支持 ---- HSSFWorkbook POI 提供了对2007版本以及更高版本的支持 ---- XSSFWorkbook 引入相关依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
/**
* 读取Excel文件的内容
* @param inputStream excel文件,以InputStream的形式传入
* @param sheetName sheet名字
* @return 以List返回excel中内容
*/
public static List<Map<String, String>> readExcel(InputStream inputStream, String sheetName)
//定义工作簿
XSSFWorkbook xssfWorkbook = null;
try
xssfWorkbook = new XSSFWorkbook(inputStream);
catch (Exception e)
System.out.println("Excel data file cannot be found!");
//定义工作表
XSSFSheet xssfSheet;
if (sheetName.equals(""))
// 默认取第一个子表
xssfSheet = xssfWorkbook.getSheetAt(0);
else
xssfSheet = xssfWorkbook.getSheet(sheetName);
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
//定义行
//默认第一行为标题行,index = 0
XSSFRow titleRow = xssfSheet.getRow(0);
//循环取每行的数据
for (int rowIndex = 1; rowIndex < xssfSheet.getPhysicalNumberOfRows(); rowIndex++)
XSSFRow xssfRow = xssfSheet.getRow(rowIndex);
if (xssfRow == null)
continue;
Map<String, String> map = new LinkedHashMap<String, String>();
//循环取每个单元格(cell)的数据
for (int cellIndex = 0; cellIndex < xssfRow.getPhysicalNumberOfCells(); cellIndex++)
XSSFCell titleCell = titleRow.getCell(cellIndex);
XSSFCell xssfCell = xssfRow.getCell(cellIndex);
map.put(getString(titleCell),getString(xssfCell));
list.add(map);
return list;
/**
* 把单元格的内容转为字符串
* @param xssfCell 单元格
* @return 字符串
*/
public static String getString(XSSFCell xssfCell)
if (xssfCell == null)
return "";
if (xssfCell.getCellTypeEnum() == CellType.NUMERIC)
return String.valueOf(xssfCell.getNumericCellValue());
else if (xssfCell.getCellTypeEnum() == CellType.BOOLEAN)
return String.valueOf(xssfCell.getBooleanCellValue());
else
return xssfCell.getStringCellValue();
/**
* 把内容写入Excel
* @param list 传入要写的内容,此处以一个List内容为例,先把要写的内容放到一个list中
* @param outputStream 把输出流怼到要写入的Excel上,准备往里面写数据
*/
public static void writeExcel(List<List> list, OutputStream outputStream)
//创建工作簿
XSSFWorkbook xssfWorkbook = null;
xssfWorkbook = new XSSFWorkbook();
//创建工作表
XSSFSheet xssfSheet;
xssfSheet = xssfWorkbook.createSheet();
//创建行
XSSFRow xssfRow;
//创建列,即单元格Cell
XSSFCell xssfCell;
//把List里面的数据写到excel中
for (int i=0;i<list.size();i++)
//从第一行开始写入
xssfRow = xssfSheet.createRow(i);
//创建每个单元格Cell,即列的数据
List sub_list =list.get(i);
for (int j=0;j<sub_list.size();j++)
xssfCell = xssfRow.createCell(j); //创建单元格
xssfCell.setCellValue((String)sub_list.get(j)); //设置单元格内容
//用输出流写到excel
try
xssfWorkbook.write(outputStream);
outputStream.flush();
outputStream.close();
catch (IOException e)
e.printStackTrace();
持续更新中…
以上是关于Java通过不同的方式上传Excel文档的主要内容,如果未能解决你的问题,请参考以下文章
Java通过jxl解析Excel文件入库,及日期格式处理方式 (附源代码)