全国居民用电数据可视化(一)
本文章主要针对数据的获取,以Excel文件的形式存储,随后利用java语言来进行编译,使用到的编译软件为IntelliJ IDEA。当编译器遍历完Excel文件中的数据后,根据自己的需求将文件中有用的数据信息存储在数据库,这里使用到的数据库软件为MySQL。
在这里,以全国的各个省份,自治区以及直辖市为例。
首先,在某网站中下载数据,以Excel文档的形式保存下来,文件的后缀名为.xls。为了后面编译器遍历方便,文件的命名都为xx合计居民用电量.xls(其中,xx为全国的某个省份、自治区或者直辖市,例如,上海合计居民用电量.xls)。当数据下载完成后,便利用编译器进行数据的读取。
随后在MySQL中创建TABLE,命名为china_province_data,主要是为了存储中国各个省份,自治区以及直辖市从2012年至2020年总居民用电量(按照年份)。表结构如下图所示:
类型 | 是否为空 | 是否为主键 | 默认值 | |
---|---|---|---|---|
cpd_id | VARCHAR(2) | 否 | 否 | 无 |
cpd_name | VARCHAR(20) | 否 | 否 | 无 |
cpd_date | DATE | 否 | 否 | 无 |
cpd_data | DOUBLE(10,2) | 否 | 否 | 无 |
注:
cpd_id指各个省份(其中也包括自治区,直辖市)的排序,不同的地方排序是不一样的,主要用以区分不同的地区,例如上海的cpd_id为1;
cpd_name指各个省份(其中也包括自治区,直辖市)的具体名称,例如上海,浙江省,内蒙古自治区;
cpd_date指具体的某个地区的某一年份,例如2013-12-31,由此便可清楚了解该地区在这一年的居民用电负荷数据;
cpd_data指具体的某个地区的某一年份的具体居民用电负荷数据,单位是万千瓦时。
在用Java编译的过程中需要下载一个jar包(Apache POI),随后利用java的io流读取文件,打开工作表Sheet,首先是读行,然后读列,其中行和列都是从0开始读取的。
jar包的下载网站链接: link.
以下代码为Java语言来读取Excel文件中的数据,获取全国各个省份,自治区以及直辖市2012年到2020年的居民用电负荷数据,创建的数据库表格(china_province_data)。
先对文件数据以字节的形式进行读取操作如读取图片视频等,即 FileInputStream流被称为文件字节输入流。对该字节流建立缓冲区,即BufferInputStream为缓冲字节流。导入jar包,即Apache POI提供给API给Java方程式对Excel文件内的内容进行读取。对读取得到的文件创建一个工作簿,随后通过序号获取得到sheet,并且获取得到最后的行的索引,当没有行或者只有一行的时候返回0。每当遍历一个Excel文件(不同的省份),则实体类china_province_data中province_id加1并且将其输入至该实体类中,同时每个省份的名字也输入至该实体类中。最后,通过序号索引获取得到指定的行,从第2行开始遍历得到每一行,目的是为了去掉表头等无用的数据,如果此行为null,则跳出该循环;当此行不为null的时候,遍历每一行的单元格,并且对数据进行筛选,选出该省份、自治区以及直辖市的年份以及居民用电负荷数据并输入至该实力类中即可。
//若非目录(即文件),则打印
if (!f.isDirectory()) {
try {
// FileInputStream流被称为文件字节输入流,对文件数据以字节的形式进行读取操作如读取图片视频等
FileInputStream fileInputStream = new FileInputStream(f);
// BufferInputStream缓冲字节流
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
// Apache POI提供给API给Java方程式对Excel文件内的内容进行读取
POIFSFileSystem fileSystem = new POIFSFileSystem(bufferedInputStream);
// 创建一个工作簿
HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
// 通过序号获取得到sheet
HSSFSheet sheet = workbook.getSheetAt(0);
// 获取得到最后的行的索引,没有行或者只有一行的时候返回0
int lastRowIndex = sheet.getLastRowNum();
//打印每一个excel文件中的行数
province_id++;
//将每个省份的编号输入至china_province_data实体类中
chinaProvinceData.setCpd_id(String.valueOf(province_id));
//将每个省份的名字输入至china_province_data实体类中
chinaProvinceData.setCpd_name(f.toString().substring(35, 37));
// 遍历得到每一行
for (int i = 2; i <= lastRowIndex; i++) {
// 通过序号索引获取得到指定的行
HSSFRow row = sheet.getRow(i);
if (row == null)
break;
// 获取得到该行不为空的单元格
short lastCellNum = row.getLastCellNum();
// 遍历得到该行的每一个单元格
String cellValue_date = row.getCell(1).getStringCellValue();
chinaProvinceData.setCpd_date(cellValue_date);
String cellValue_data = row.getCell(2).getStringCellValue();
chinaProvinceData.setCpd_data(Double.valueOf(cellValue_data));
System.out.println(chinaProvinceData);
chinaProvinceDataDao.insertChinaProvinceData(chinaProvinceData);
}
System.out.println();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
遍历的结果为(以上海为例遍历得到的部分结果示例):
数据库的结果为(以上海为例遍历得到的部分结果示例):
下一期学习记录为利用Apache Echarts实现全国数据的可视化。