共享单车之数据存储-获取工作簿中的数据

本文介绍了如何使用JavaPOI库读取Excel文件data.xls中的数据,包括获取Workbook、Sheet、Row和Cell对象,以及处理不同类型的单元格数据,如数字和日期。通过示例代码展示了如何获取trip_id、开始时间和结束经度等信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第1关:获取工作簿中的数据

任务描述

本关任务:获取data.xls文件中的数据。

相关知识

获取工作簿中的信息,我们可以使用Java POIPOI是一个提供APIJava程序对Microsoft Office格式档案读和写的功能)提供的Workbook类来操作。

为了完成本关任务,你需要掌握:如何获取Wookbook的数据。

读取一个Wookbook中数据

读取工作簿中的内容大致分为下列几个步骤:

  • 使用WorkbookFactory新建一个工作簿(Wookbook
 
  1. InputStream resourceAsStream = SaveData.class.getClassLoader().getResourceAsStream("data.xls");//通过类加载器获取本地文件
  2. Workbook workbook = WorkbookFactory.create(resourceAsStream);
  • 获取给定索引处的Sheet对象。
 
  1. Sheet sheet = workbook.getSheetAt(0);//拿到Wookbook中的第一个Sheet

说明:一个Wookbook中可能存在多个Sheet,因此需要指定索引,如下图:

  • 通过Sheet对象获取指定行和行内单元格。
 
  1. Row row = sheet.getRow(1);//首行一般为说明,因此我们直接从第一行进行获取
  2. Cell cell = row.getCell(0);//获取当前行第一个单元格
  • 获取单元格中的值。

上图观察表结构数据trip_id为数字类型,时间为字符类型,在获取数据时我们必须遵循类型规则,对应获取。

 
  1. //1.获取第一行中trip_id列的第一个值(33404951)
  2. double numericCellValue = row.getCell(0).getNumericCellValue();
  3. DecimalFormat formatter = new DecimalFormat("########");//一个#表示一个数字
  4. String trip_id =formatter.format(numericCellValue);//我们需要使用DecimalFormat将数据格式化
  5. //2.获取第一行中开始时间单元格的值
  6. FastDateFormat instance = FastDateFormat.getInstance("MM/dd/yyyy HH:mm");
  7. String beginTimeValue = row.getCell(1).getStringCellValue();
  8. //为了方便后面的数据分析计算我们将需要将时间格式转为时间戳
  9. long begintime = instance.parse(beginTimeValue).getTime();
  10. //3.获取第一行开始经度单元格的值
  11. double start_longitude = row.getCell(7).getNumericCellValue();
  12. DecimalFormat formatter = new DecimalFormat("###.######");//#表示一个数字,不包括0
  13. String longitude = formatter.format(start_longitude);
  • 获取当前sheet中的物理定义行数
  1. //为了完整的将整个Sheet中的数据全部存储,我们需要知道整个Sheet中有多少条数据,然后对其遍历
  2. int rows = sheet.getPhysicalNumberOfRows();

编程要求

在右侧编辑器Begin-End中补充代码,获取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|

注意:表中有非法数据,我们在获取时为了避免出错或者获取到空的数据,可以使用try-catch将其抛出。

测试说明

平台会对你编写的代码进行测试:

测试输入:无; 预期输出: 骑行id:33404951,开始时间:1498838940000,车辆id:5996,结束经度:39.043732 骑行id:33415440,开始时间:1498845540000,车辆id:6273,结束经度:39.044701

完成代码:

package com.educoder.savedata;

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 {
        /**********     Begin    **********/
		//1.通过类加载器获取本地文件并新建一个工作簿
        InputStream resourceAsStream = SaveData.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{
                DecimalFormat formatter1 = new DecimalFormat("########");
                String trip_id = formatter1.format(row.getCell(0).getNumericCellValue());
                //开始时间
                FastDateFormat instance = FastDateFormat.getInstance("MM/dd/yyyyHH: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("###.######");
                String longitude = formatter2.format(start_longitude);
                System.out.println("骑行id:"+trip_id+",开始时间:"+begintime+",车辆id:"+car_id+",结束经度:"+longitude);
            }catch(Exception e){

            }
        }
        
        
       /******** **    End    ******* ***/
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值