xls文件上传并解析遍历

逻辑流程:后台获取到文件流,保存到本地,使用POI读取本地保存的数据并进行解析。


关键jar包:

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.springframework.stereotype.Controller;


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

后台文件保存接口。

@RequestMapping(value = "/fileTest")
public String test(MultipartFile files, HttpServletRequest request, HttpServletResponse response)
throws IOException {
FileUtils.copyInputStreamToFile(files.getInputStream(), new File("C://", "message.xls"));
File file = new File("C://message.xls");
return null;
}


文件解析方法(从某位前辈那边拿过来的,做了些修改,时间有点长记不清是哪位了,如果看到了联系我,我会标明出处)

static String[][] getData(File file, int ignoreRows) throws FileNotFoundException, IOException {
List<String[]> result = new ArrayList<String[]>();
int rowSize = 0;
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
// 打开HSSFWorkbook
POIFSFileSystem fs = new POIFSFileSystem(in);
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFCell cell = null;
for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {
HSSFSheet st = wb.getSheetAt(sheetIndex);
// 第一行为标题,不取
for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) {
HSSFRow row = st.getRow(rowIndex);
if (row == null) {
continue;
}
int tempRowSize = row.getLastCellNum() + 1;
if (tempRowSize > rowSize) {
rowSize = tempRowSize;
}
String[] values = new String[rowSize];
Arrays.fill(values, "");
boolean hasValue = false;
for (short columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) {
String value = "";
// 读取某一行现有的单元格
cell = row.getCell(columnIndex);
if (cell != null) {
// 注意:一定要设成这个,否则可能会出现乱码
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
if (date != null) {
value = new SimpleDateFormat("yyyy-MM-dd").format(date);
} else {
value = "";
}
} else {
value = new DecimalFormat("0").format(cell.getNumericCellValue());
}
break;
case HSSFCell.CELL_TYPE_FORMULA:
// 导入时如果为公式生成的数据则无值
if (!cell.getStringCellValue().equals("")) {
value = cell.getStringCellValue();
} else {
value = cell.getNumericCellValue() + "";
}
break;
case HSSFCell.CELL_TYPE_BLANK:
break;
case HSSFCell.CELL_TYPE_ERROR:
value = "";
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
value = (cell.getBooleanCellValue() == true ? "Y" : "N");
break;
default:
value = "";
}
}
if (columnIndex == 0 && value.trim().equals("")) {
break;
}
values[columnIndex] = rightTrim(value);
hasValue = true;
}


if (hasValue) {
result.add(values);
}
}
}
in.close();
String[][] returnArray = new String[result.size()][rowSize];
for (int i = 0; i < returnArray.length; i++) {
returnArray[i] = (String[]) result.get(i);
}
return returnArray;
}


/**
* 去掉字符串右边的空格

* @param str
*            要处理的字符串
* @return 处理后的字符串
*/
public static String rightTrim(String str) {
if (str == null) {
return "";
}
int length = str.length();
for (int i = length - 1; i >= 0; i--) {
if (str.charAt(i) != 0x20) {
break;
}
length--;
}
return str.substring(0, length);
}

在Java中实现上传Excel文件并解析,通常会用到Apache POI库,这是一个广泛使用的开源库,专门用于读取和写入Microsoft Office格式的文件。以下是实现这一功能的基本步骤: 1. **上传文件**: 首先,需要使用一个Web框架(如Spring MVC)来处理文件上传的请求。在控制器(Controller)中,可以通过注解`@PostMapping`来定义一个方法来接收上传的文件。使用`MultipartFile`类型的参数来接收上传的文件。 2. **保存文件**: 将上传的文件保存到服务器的文件系统或数据库中,以便后续处理。 3. **解析Excel文件**: 使用Apache POI读取保存的Excel文件。根据文件类型(如`.xls`或`.xlsx`),使用相应的API。对于`.xlsx`文件,通常使用`XSSFWorkbook`;对于`.xls`文件,使用`HSSFWorkbook`。 4. **读取数据**: 创建一个工作簿(Workbook)实例,并用它来获取一个或多个工作表(Sheet)。然后遍历工作表中的行(Row)和单元格(Cell),根据需要读取单元格中的数据。 5. **数据处理**: 解析出来的数据可以进行进一步的处理,例如存入数据库或进行业务逻辑处理。 下面是一个简单的代码示例: ```java import org.apache.poi.ss.usermodel.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; // ... public class ExcelParser { public void parseExcelFile(MultipartFile file) throws IOException { // 创建工作簿实例 Workbook workbook = null; if (file.getContentType().equals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) { workbook = new XSSFWorkbook(file.getInputStream()); } else if (file.getContentType().equals("application/vnd.ms-excel")) { workbook = new HSSFWorkbook(file.getInputStream()); } // 获取第一个工作表 Sheet sheet = workbook.getSheetAt(0); // 遍历行和单元格 for (Row row : sheet) { for (Cell cell : row) { // 根据单元格的数据类型读取数据 switch (cell.getCellType()) { case STRING: // 处理字符串类型单元格数据 break; case NUMERIC: // 处理数字类型单元格数据 break; // 其他类型的处理... } } } // 关闭工作簿资源 workbook.close(); } } ``` 在使用上述代码之前,确保已经将Apache POI库添加到项目的依赖中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值