Java中读取Excel数据

1.构建弹窗,选择文件
筛选excel文件(后缀名为,xls、xlsx)97-2003版和2007版本。

需要注意的是包不要导错了
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import java.io.File;

		JFileChooser fileChooser = new JFileChooser();
		fileChooser.setMultiSelectionEnabled(false);
		fileChooser.setFileFilter(new FileFilter() {

			@Override
			public boolean accept(File file) {
				return file.getName().toLowerCase().endsWith(".xlsx") || file.getName().toLowerCase().endsWith(".xls");
			}

			// 设置可以选择的文件类型
			@Override
			public String getDescription() {
				return "Excel工作薄(*.xlsx)";
			}

		});
		//就会出现一个文件选择框
		fileChooser.showOpenDialog(null);
		//获取选中的文件
		File file = fileChooser.getSelectedFile();
		

2.引入解析Excel需要的jar包

<!-- 操作excel -->
	<dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi</artifactId>
          <version>3.10-FINAL</version>
    </dependency>
    <dependency>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-ooxml</artifactId>
         <version>3.10-FINAL</version>
    </dependency>
<!-- 操作excel -->

最好是引入3.10-FINAL版本的,原以为不同版本差别不大。但是我踩坑了,
引入4.0或者4.1版本时,
Cell类报错,手动引入import org.apache.poi.ss.usermodel.Cell;还是会把报错,经过对比发现,原因是Cell这个接口里面的内容不同,
3.10版是这样的
Cell接口
4.0,4.1里面没有,所以会报错。

3.解析excel文件数据需要注意:处理解析数据所用的接口不同)。

		FileInputStream fis = null;
		try {
			//传入之前获取的file
			fis = new FileInputStream(file);
			// 查看文件路径
			String str = file.getPath();
			// 获取文件名后缀,Excel,97-2003,2007两个版本处理方式不同
			String theFormat = str.substring(str.indexOf("."), str.length());
			// 2007版本处理
			if (theFormat.equals(".xlsx")) {
				XSSFWorkbook wb = new XSSFWorkbook(fis);
				// 根据index获取excel文件内部的sheet,也是0开始
				XSSFSheet sheet = wb.getSheetAt(0);
				int lastRowNum = sheet.getLastRowNum();// 统计行数(从0开始算)
				// 行数和列数都是从0开始
				// System.out.println(lastRowNum);
				// i可以控制筛选掉表头
				for (int i = 1; i <= lastRowNum; i++) {
					// 获取当前行
					XSSFRow row = sheet.getRow(i);
					// 获取当前行的第一列元素
					String KHDDH = getColumnByRow(row, 0);
					// 获取当前行的第二列元素
					String KH = getColumnByRow(row, 1);
					// 获取当前行的第三列元素
					String YWY = getColumnByRow(row, 2);
					...
					//自行拼成实体对象
				}
			} else if (theFormat.equals(".xls")) {
				//97-2003版本处理
				inStream = new FileInputStream(file);
				HSSFWorkbook wb = new HSSFWorkbook(inStream);
				HSSFSheet sheet = wb.getSheetAt(0);
				int lastRowNum = sheet.getLastRowNum();// 统计行数(从0开始算)
				for (int i = 1; i <= lastRowNum; i++) {
					// 获取当前行
					HSSFRow row = sheet.getRow(i);
					// 获取当前行的第一列元素
					String KHDDH = getColumnByRow(row, 0);
					// 获取当前行的第二列元素
					String KH = getColumnByRow(row, 1);
					// 获取当前行的第三列元素
					String YWY = getColumnByRow(row, 2);
					...
					//自行拼成实体对象
				}
			}
		} catch (IOException | BusinessException  e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
异常:
 Exception in thread "main" java.lang.IllegalStateException: Cannot get
 a STRING value from a NUMERIC cell //
 
//由于getStringCellValue读取整型时会报异常,先设置Cell的类型,然后就可以把纯数字作为String类型读进来了
 row.getCell(index).setCellType(Cell.CELL_TYPE_STRING); 	
 // 列元素,通过下标索引,从0开始	
 String Column = row.getCell(index).getStringCellValue();

将获取某一行数据封装成方法,便于复用

	// 获取当前行的某一列,97-03版的Excel
	public static String getColumnByRow(HSSFRow row, int index) {
		// 由于getStringCellValue读取整型时会报异常,先设置Cell的类型,然后就可以把纯数字作为String类型读进来了
		row.getCell(index).setCellType(Cell.CELL_TYPE_STRING);
		String Column = row.getCell(index).getStringCellValue();// 列元素,通过下标索引,从0开始
		return Column;
	}

	// 获取当前行的某一列,2007版的Excel
	public static String getColumnByRow(XSSFRow row, int index) {
		// 由于getStringCellValue读取整型时会报异常,先设置Cell的类型,然后就可以把纯数字作为String类型读进来了
		row.getCell(index).setCellType(Cell.CELL_TYPE_STRING);
		String Column = row.getCell(index).getStringCellValue();// 列元素,通过下标索引,从0开始
		return Column;
	}

4.将获取到的数据封装成单个实体。
得到的String,一个个set进入实体类(无需多言)
5.插入数据库
无非就是访问数据库,insert进去。

实例演示:

注意,在演示之前,需要先存在Excel,并且里面有数据。

package com.leo.springboot.excel;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;

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.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


public class ExcelImpData {

	public static void main(String[] args) {
		JFileChooser fileChooser = new JFileChooser();
		fileChooser.setMultiSelectionEnabled(false);
		fileChooser.setFileFilter(new FileFilter() {

			@Override
			public boolean accept(File file) {
				return file.getName().toLowerCase().endsWith(".xlsx") || file.getName().toLowerCase().endsWith(".xls");
			}

			// 设置可以选择的文件类型
			@Override
			public String getDescription() {
				return "Excel工作薄(*.xlsx)";
			}

		});
		fileChooser.showOpenDialog(null);
		File file = fileChooser.getSelectedFile();
		if (file != null) {
			//解析Excel文件数据
			setDataFromExcel(file);
		}

	}

	public static void setDataFromExcel(File file) {
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(file);
			// 查看文件路径
			String str = file.getPath();
			// 获取文件名后缀,Excel,97-2003,2007两个版本处理方式不同
			String theFormat = str.substring(str.indexOf("."), str.length());
			/*
			 * System.out.println(str); System.out.println(theFormat);
			 */
			// 2007版本处理
			if (theFormat.equals(".xlsx")) {
				XSSFWorkbook wb = new XSSFWorkbook(fis);
				// 根据index获取excel文件内部的sheet,也是0开始
				XSSFSheet sheet = wb.getSheetAt(0);
				int lastRowNum = sheet.getLastRowNum();// 统计行数(从0开始算)
				// 行数和列数都是从0开始
				// System.out.println(lastRowNum);
				// i可以控制筛选掉表头
				System.out.println("客户订单号\t" + "客户\t" + "业务员\t" + "产品编号\t"
						+ "发货数量\t" + "成交金额\t" + "测试行数据");
				for (int i = 1; i <= lastRowNum; i++) {
					// 获取当前行
					XSSFRow row = sheet.getRow(i);
					// 客户订单号
					String KHDDH = getColumnByRow(row, 0);
					// 客户
					String KH = getColumnByRow(row, 1);
					// 业务员
					String YWY = getColumnByRow(row, 2);
					// 产品编号
					String CPBH = getColumnByRow(row, 3);
					// 发货数量
					String FHSL = getColumnByRow(row, 4);
					// 成交金额
					String CJJE = getColumnByRow(row, 5);
					// 测试行数据
					String test = getColumnByRow(row, 6);

					System.out.println(KHDDH + "\t" + KH + "\t" + YWY + "\t"
							+ CPBH + "\t" + FHSL + "\t" + CJJE + "\t" + test);
				}
			
				
				
			} else if (theFormat.equals(".xls")) {
				fis = new FileInputStream(file);
				HSSFWorkbook wb = new HSSFWorkbook(fis);
				HSSFSheet sheet = wb.getSheetAt(0);
				int lastRowNum = sheet.getLastRowNum();// 统计行数(从0开始算)
				for (int i = 1; i <= lastRowNum; i++) {
					// 获取当前行
					HSSFRow row = sheet.getRow(i);
					// 客户订单号
					String KHDDH = getColumnByRow(row, 0);
					// 客户
					String KH = getColumnByRow(row, 1);
					// 业务员
					String YWY = getColumnByRow(row, 2);
					// 产品编号
					String CPBH = getColumnByRow(row, 3);
					// 发货数量
					String FHSL = getColumnByRow(row, 4);
					// 成交金额
					String CJJE = getColumnByRow(row, 5);
					// 测试行数据
					String test = getColumnByRow(row, 6);

					System.out.println(KHDDH + "\t" + KH + "\t" + YWY + "\t"
							+ CPBH + "\t" + FHSL + "\t" + CJJE + "\t" + test);
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	// 获取当前行的某一列,97-03版的Excel
	public static String getColumnByRow(HSSFRow row, int index) {
		// 由于getStringCellValue读取整型时会报异常,先设置Cell的类型,然后就可以把纯数字作为String类型读进来了
		row.getCell(index).setCellType(Cell.CELL_TYPE_STRING);
		String Column = row.getCell(index).getStringCellValue();// 列元素,通过下标索引,从0开始
		return Column;
	}

	// 获取当前行的某一列,2007版的Excel
	public static String getColumnByRow(XSSFRow row, int index) {
		// 由于getStringCellValue读取整型时会报异常,先设置Cell的类型,然后就可以把纯数字作为String类型读进来了
		row.getCell(index).setCellType(Cell.CELL_TYPE_STRING);
		String Column = row.getCell(index).getStringCellValue();// 列元素,通过下标索引,从0开始
		return Column;
	}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳舞 D 猴子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值