气象数据读取(7)---事半功倍之存入Excel二
1.数据存储
variable里面的变量和全局变量还不太一样,它自己本身就是个具有长度大于一的数组。这也为我们的存储带来了一些困难。但是,我们程序员不怕困难啊,哈哈哈哈。
2.构建工具类
我们在utils下创建一个NcVrToExcellUtils类,此时项目结构如下:
考虑到实际情况,我们并不会创建大量的列。所以本工具类会对总的列数进行控制, 当然,如果你想不受控制,也可以直接修改源码,哈哈哈。
思路:还是分为两种情况:
- 直接给出目标文件夹,读取全部文件,并对目标数据进行存取。
- 给出你匹配过得文件全路径名,并对目标数据进行存取。
但是这个和全局变量还不太一样,全局变量可以放在一个列表里。这个不行,因为每一个文件都会是一个大列表。所以我们需要在读取之前,先创建excel对象,并赋予sheet。然后通过循环,每读一个文件,我就创建三列,alt,temp,press。
代码:
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.ma2.Array;
import ucar.nc2.NetcdfFile;
import java.io.*;
import java.util.Arrays;
import java.util.List;
/**
* 考虑到实际情况,我们并不会创建大量的列。所以本工具类会对总的列数进行控制,
* 当然,如果你想不受控制,也可以直接修改源码,哈哈哈
* 思路:还是分为两种情况
* 1.直接给出目标文件夹,读取全部文件,并对目标数据进行存取。
* 但是这个和全局变量还不太一样,全局变量可以放在一个列表里。这个不行,因为每一个文件都会是一个大列表
* 所以我们需要在读取之前,先创建excel对象,并赋予sheet。然后通过循环,每读一个文件,我就创建三列,alt,temp,press
*/
// for (int i1 = 0; i1 < mAltList.get(0).size(); i1++) {
// HSSFRow row1 = sheet.createRow(i1 +1);
// row1.createCell(0*3).setCellValue(mAltList.get(0).get(i1).toString().substring(0, 5));
// row1.createCell(0*3+1).setCellValue(mTempList.get(0).get(i1).toString().substring(0, 7));
//
// String str = "/Variables.xls";
// makeExcel(filePath, str, hssfWorkbook); }
public class NcVrToExcellUtils {
private List<Array> mAltList;
private List<Array> mTempList;
private List<Array> mPressList;
private List<Array> mAltListByCondition;
private List<Array> mTempListByCondition;
private List<Array> mPressListByCondition;
public void setVariablesAsExcel(String filePath) {
getRoData(filePath);
//第一步,创建一个workbook对应一个excel文件
createExcel(filePath, mAltList, mTempList, mPressList);
}
public void setVariablesAsExcelByCondition(List<String> filePathList, String filePath) {
getRoDataByCondition(filePathList);
//第一步,创建一个workbook对应一个excel文件
createExcel(filePath, mAltListByCondition, mTempListByCondition, mPressListByCondition);
}
private void createExcel(String filePath, List<Array> altListByCondition, List<Array> tempListByCondition, List<Array> pressListByCondition) {
HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
for (int i = 0; i < altListByCondition.size(); i++) {
//第二部,在workbook中创建一个sheet对应excel中的sheet
HSSFSheet sheet = hssfWorkbook.createSheet("用户表" + i);
//第三部,在sheet表中添加表头第0行,老版本的poi对sheet的行列有限制
HSSFRow row = sheet.createRow(0);
HSSFCell cell;
cell = row.createCell(0);
cell.setCellValue("alt");
cell = row.createCell( 1);
cell.setCellValue("temp");
cell = row.createCell(2);
cell.setCellValue("pres");
for (long l = 0; l < altListByCondition.get(i).getSize(); l++) {
HSSFRow row1 = sheet.createRow((int) l);
row1.createCell(0).setCellValue(altListByCondition.get(i).getDouble((int) l));
row1.createCell(1).setCellValue(tempListByCondition.get(i).getDouble((int) l));
row1.createCell(2).setCellValue(pressListByCondition.get(i).getDouble((int) l));
}
}
String str = "/Variables.xls";
makeExcel(filePath, str, hssfWorkbook);
}
/**
* 获取数据
*
* @param filePath
*/
public void getRoData(String filePath) {
ReadAllNcDataUtils rd = new ReadAllNcDataUtils();
List<NetcdfFile> nc = rd.getNcDataList(filePath);
mAltList = rd.getAltList(nc);
mTempList = rd.getTempList(nc);
mPressList = rd.getPressList(nc);
}
public void getRoDataByCondition(List<String> filePathList) {
ReadAllNcDataUtils rd = new ReadAllNcDataUtils();
List<NetcdfFile> nc = rd.getConditionNcDataList(filePathList);
mAltListByCondition = rd.getAltList(nc);
mTempListByCondition = rd.getTempList(nc);
mPressListByCondition = rd.getPressList(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();
}
}
}
}
}
3.总结
通过这两篇文章,我们也对使用Java操作Excel有了一定的了解。但是,这只是一些皮毛哈,要想深入了解,有兴趣的可以阅读相应的源码,哈哈哈。这里就不多深入了。
- [x] 我们的征途是星辰大海。我就是我,我就是天!
- [x] 疾风亦有龟途对本文享有版权,转载请标明原文链接,禁止复制!
- [x] 欢迎访问我的个人博客网站---->夙夜星辰叹
- [x] 欢迎关注我的微信公众号:
版权属于: 依依东望