获取工作薄里的数据,可以使用Java poi提供的workbook类来操作
读取一个 Wookbook
中数据
读取工作簿中的内容大致分为下列几个步骤:
- 使用
WorkbookFactory
新建一个工作簿(Wookbook
)
InputStream resourceAsStream = SaveData.class.getClassLoader().getResourceAsStream("data.xls");//通过类加载器获取本地文件
Workbook workbook = WorkbookFactory.create(resourceAsStream);
- 获取给定索引处的
Sheet
对象。
Sheet sheet = workbook.getSheetAt(0);//拿到Wookbook中的第一个Sheet
注意:一个wookbook可能存在多个sheet,因此需要指定索引。
- 通过
Sheet
对象获取指定行和行内单元格。
Row row = sheet.getRow(1);//首行一般为说明,因此我们直接从第一行进行获取
Cell cell = row.getCell(0);//获取当前行第一个单元格
//1.获取第一行中trip_id列的第一个值(33404951) double numericCellValue = row.getCell(0).getNumericCellValue(); DecimalFormat formatter = new DecimalFormat("########");//一个#表示一个数字 String trip_id =formatter.format(numericCellValue);//我们需要使用DecimalFormat将数据格式化 //2.获取第一行中开始时间单元格的值 FastDateFormat instance = FastDateFormat.getInstance("MM/dd/yyyy HH:mm"); String beginTimeValue = row.getCell(1).getStringCellValue(); //为了方便后面的数据分析计算我们将需要将时间格式转为时间戳 long begintime = instance.parse(beginTimeValue).getTime(); //3.获取第一行开始经度单元格的值 double start_longitude = row.getCell(7).getNumericCellValue(); DecimalFormat formatter = new DecimalFormat("###.######");//#表示一个数字,不包括0 String longitude = formatter.format(start_longitude);
- 获取当前
sheet
中的物理定义行数
//为了完整的将整个Sheet中的数据全部存储,我们需要知道整个Sheet中有多少条数据,然后对其遍历
int rows = sheet.getPhysicalNumberOfRows();
测试:
获取data.xls文件中的数据(trip_id,开始时间,结束经度,车辆,ID)
文件格式如下:
trip_id | 开始时间 | 结束时间 | 车辆id | 出发地 | 目的地 | 所在城市 | 开始经度 | 开始纬度 | 结束经度 | 结束纬度 |
---|---|---|---|---|---|---|---|---|---|---|
33404951 | 7/1/2017 0:09 | 7/1/2017 0:45 | 5996 | 韩庄村北782米 | 韩庄村北782米 | 河北省保定市雄县 | 39.043732 | 116.260139 | 39.043732 | 116.260139 |
33463211 | 7/1/2017 1:01 | 7/1/2017 11:13 | 6342 | 韩庄村北782米 | 39.043732 | 116.260139 | NA | NA | ||
33415440 | 7/1/2017 1:59 | 7/1/2017 2:12 | 6273 | 擎天矿用材料有限公司北609米 | 河北省保定市雄县G45(大广高速) | 河北省保定市雄县G45(大广高速) | 39.041691 | 116.235352 | 39.044701 | 116.252441 |
tips:由于表中有非法数据,所以需要抛出异常。
import java.io.InputStream; import java.text.DecimalFormat; import org.apache.commons.lang3.time.FastDateFormat; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; public class SaveWookbook { public static void main(String[] args) throws Exception { //1.通过类加载器获取本地文件并新建一个工作簿 InputStream resourceAsStream = SaveWookbook.class.getClassLoader().getResourceAsStream("data.xls"); Workbook workbook = WorkbookFactory.create(resourceAsStream); //2.拿到工作簿中第一个Sheet Sheet sheet = workbook.getSheetAt(0); //3.获取当前Sheet中的行数 int rows = sheet.getPhysicalNumberOfRows(); //4.对所有有效数据进行遍历并输出(期间无效数据通过异常捕获方式清除) for (int n = 1; n < rows; n++) { Row row = sheet.getRow(n); //通过异常方式清除格式不准确、数据不存在的无效行 try { //trip_id DecimalFormat formatter1 = new DecimalFormat("########"); String trip_id = formatter1.format(row.getCell(0).getNumericCellValue()); //开始时间 FastDateFormat instance = FastDateFormat.getInstance("MM/dd/yyyy HH:mm"); String beginTimeValue = row.getCell(1).getStringCellValue(); long begintime = instance.parse(beginTimeValue).getTime(); //车辆id int car_id = (int)row.getCell(3).getNumericCellValue(); //结束经度 double start_longitude = row.getCell(9).getNumericCellValue(); DecimalFormat formatter2 = new DecimalFormat("###.######");//#表示一个数字,不包括0 String longitude = formatter2.format(start_longitude); System.out.println("骑行id:"+trip_id+",开始时间:"+begintime+",车辆id:"+car_id+",结束经度:"+longitude); } catch (Exception e) { } } } }
给你点赞
good厉害了