气象数据读取(6)---事半功倍之存入Excel
1.数据的存储
在进行日常工作中,我们经常会遇到对数据的存储的需求。特别是在气象研究当中,对数据的存储,复现尤为重要。不同的编程语言,有不同的方法。今天我们来聊聊如何如何使用Java将Nc数据保存到Excel中。后续如果有时间,还可以做一下txt文件的读,存。
2.引入jar包
2.1jar包的引入
在第一篇文章的时候,我们介绍了pom文件和jar包。这里我们就不详细介绍了。我们在pom文件里加入
<!--处理excel-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
然后等待构建完成。我们添加的这两个jar包,就是用来处理Excel对象的。具体使用方法,可参考相应jar包官网。
2.2构建工具类
我们在utils包下新建NcGlobalVrToExcelUtils,NcVrToExcelUtils两个类。
此时的项目结构如上图所示。
首先来看NcGlobalVrToExcelUtils类,这个类就对应了Nc文件的全局变量(掩星点lat,lon,发生时间等.....)
我们来捋一下逻辑:
- 创建一个Excel对象
- 在对象中添加sheet,行名,列名
- 获得全局变量数据
- 将全局变量以流的形式注入excel文件
- 关闭流
package roDataDemo.utils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import ucar.nc2.NetcdfFile;
import java.io.*;
import java.util.List;
public class NcGlobalVrToExcelUtils {
private List<String> mRoLat;
private List<String> mRoLatByCondition;
private List<String> mRoLon;
private List<String> mRoLonByCondition;
//首先获得要存储的数据
//包括 getGlobalVariablesLists lat lon year month day hour minute second
//getVariablesLists alt temp press
//在ReadAllNcDataUtils中对于getGlobalVariablesLists和getVariablesLists采用了不同的数据存储方式
//所以在本工具类里也将采用两种方法来将数据写入excel
public void setGlobalVariablesAsExcel(String filepath) {
getRoData(filepath);
//第一步,创建一个workbook对应一个excel文件
HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
//第二部,在workbook中创建一个sheet对应excel中的sheet
HSSFSheet sheet = hssfWorkbook.createSheet("用户表一");
//第三部,在sheet表中添加表头第0行,老版本的poi对sheet的行列有限制
HSSFRow row = sheet.createRow(0);
//第四步,创建单元格,设置表头
HSSFCell cell;
cell = row.createCell(0);
cell.setCellValue("lat");
cell = row.createCell(1);
cell.setCellValue("lon");
for (int i = 0; i < mRoLat.size(); i++) {
HSSFRow row1 = sheet.createRow(i + 1);
row1.createCell(0).setCellValue(mRoLat.get(i));
row1.createCell(1).setCellValue(mRoLon.get(i));
}
String str = "/GlobalVariables.xls";
makeExcel(filepath, str, hssfWorkbook);
}
public void setGlobalVariablesAsExcelByCondition(List<String> filePathList,String filePath) {
getRoDataByCondition(filePathList);
//第一步,创建一个workbook对应一个excel文件
HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
//第二部,在workbook中创建一个sheet对应excel中的sheet
HSSFSheet sheet = hssfWorkbook.createSheet("用户表一");
//第三部,在sheet表中添加表头第0行,老版本的poi对sheet的行列有限制
HSSFRow row = sheet.createRow(0);
//第四步,创建单元格,设置表头
HSSFCell cell = row.createCell(0);
cell = row.createCell(0);
cell.setCellValue("lat");
cell = row.createCell(1);
cell.setCellValue("lon");
for (int i = 0; i < mRoLatByCondition.size(); i++) {
HSSFRow row1 = sheet.createRow(i + 1);
row1.createCell(0).setCellValue(mRoLatByCondition.get(i));
row1.createCell(1).setCellValue(mRoLonByCondition.get(i));
}
String str = "/GlobalVariablesByCondition.xls";
makeExcel(filePath, str, hssfWorkbook);
}
/**
* 获取数据
*
* @param filePath
*/
public void getRoData(String filePath) {
ReadAllNcDataUtils rd = new ReadAllNcDataUtils();
List<NetcdfFile> nc = rd.getNcDataList(filePath);
mRoLat = rd.getRoLat(nc);
mRoLon = rd.getRoLon(nc);
}
public void getRoDataByCondition(List<String> filePathList) {
ReadAllNcDataUtils rd = new ReadAllNcDataUtils();
List<NetcdfFile> nc = rd.getConditionNcDataList(filePathList);
mRoLatByCondition = rd.getRoLat(nc);
mRoLonByCondition = rd.getRoLon(nc);
}
public void makeExcel(String filepath, String fpPlus, HSSFWorkbook hf) {
String str = filepath + fpPlus;
File file = new File(str);
if (file.exists()) {
file.deleteOnExit();
file = new File(str);
}
OutputStream outputStream = null;
try {
outputStream = new FileOutputStream(file);
try {
hf.write(outputStream);
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
我们来分析一下上述代码:
在数据存入时,我们提供了两个方法,一种是有条件存储,一种是普通存储。二者有什么区别呢?
有条件存储存储setGlobalVariablesAsExcelByCondition:有条件存储方法,有两个参数。第一个是List类型,他是指你经过条件匹配后得到的文件路径集合,第二个参数则是生存的excel文件的目标路径。
无条件存储:setGlobalVariablesAsExcel:无条件方法只有一个参数,这个参数是你的目标路径,这个目标路径存储的就是你的NC数据。
经过上面的分析,是不是有种豁然开朗的感觉?
3.总结
这一篇文章,我们为全局变量提供了两种方法存储为excel文件。是不是颇有成就感呢?下一篇文章,我们将会分享,将变量存储为excel文件。
- [x] 我们的征途是星辰大海。我就是我,我就是天!
- [x] 疾风亦有龟途对本文享有版权,转载请标明原文链接,禁止复制!
- [x] 欢迎访问我的个人博客网站---->夙夜星辰叹
- [x] 欢迎关注我的微信公众号:
版权属于: 依依东望