使用Java获取excel数据表

05-04 139次浏览 已收录 2个评论

获取工作薄里的数据,可以使用Java poi提供的workbook类来操作

读取一个 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);//获取当前行第一个单元格
//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);
  • 获取当前 <span class="pln">sheet</span></code>中的物理定义行数</li>
    </ul>
    <ol class="linenums">
    <li class="L0"><code><span class="com">//为了完整的将整个Sheet中的数据全部存储,我们需要知道整个Sheet中有多少条数据,然后对其遍历</span></code></li>
    <li class="L1"><code><span class="kwd">int</span><span class="pln"> rows </span><span class="pun">=</span><span class="pln"> sheet</span><span class="pun">.</span><span class="pln">getPhysicalNumberOfRows</span><span class="pun">();</span></code></li>
    </ol>
    <p><span style="color: #800000;">测试:</span></p>
    <p>获取data.xls文件中的数据(trip_id,开始时间,结束经度,车辆,ID)</p>
    <p>文件格式如下:</p>

    <!-- wp:table {"className":"is-style-stripes"} -->
    <figure class="wp-block-table is-style-stripes"><table class=""><thead><tr><th>trip_id</th><th>开始时间</th><th>结束时间</th><th>车辆id</th><th>出发地</th><th>目的地</th><th>所在城市</th><th>开始经度</th><th>开始纬度</th><th>结束经度</th><th>结束纬度</th></tr></thead><tbody><tr><td>33404951</td><td>7/1/2017 0:09</td><td>7/1/2017 0:45</td><td>5996</td><td>韩庄村北782米</td><td>韩庄村北782米</td><td>河北省保定市雄县</td><td>39.043732</td><td>116.260139</td><td>39.043732</td><td>116.260139</td></tr><tr><td>33463211</td><td>7/1/2017 1:01</td><td>7/1/2017 11:13</td><td>6342</td><td>韩庄村北782米</td><td></td><td></td><td>39.043732</td><td>116.260139</td><td>NA</td><td>NA</td></tr><tr><td>33415440</td><td>7/1/2017 1:59</td><td>7/1/2017 2:12</td><td>6273</td><td>擎天矿用材料有限公司北609米</td><td>河北省保定市雄县G45(大广高速)</td><td>河北省保定市雄县G45(大广高速)</td><td>39.041691</td><td>116.235352</td><td>39.044701</td><td>116.252441</td></tr></tbody></table></figure>
    <!-- /wp:table -->

    <p>tips:由于表中有非法数据,所以需要抛出异常。</p>
    <pre class="EnlighterJSRAW" data-enlighter-language="java">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) {
    }
    }
    }
    }

     


    渣渣龙, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
    转载请注明原文链接:使用Java获取excel数据表
    喜欢 (0)

您必须 登录 才能发表评论!

(2)个小伙伴在吐槽
  1. 给你点赞
    我是你哥2020-05-26 09:35
  2. good厉害了
    渣渣辉2020-05-26 10:00