将数据从 java 导出到 excel
Exporting data to excel from java
我会尽力解释我的问题,所以如果 post 的部分内容令人困惑,我深表歉意。我有两列数据,如下所示:-
只有 6000 多行。我想要做的是取每个 rt 值在 2 范围内的 mz 值之间的差异。例如,使用此 post 上的图像,第 2 行中的 mz 值(100.9035)和第 6 行 (102.9007) 中的 mz 值分别具有 8.07 和 7.36 的 RT 值,即 RT 值彼此相差在 2 以内。由此,我想用第二个 mz 值减去第一个 mz 值来计算差值,然后将此信息导出到 excel。我希望对 2 秒范围内的所有 mz 值(+ 或 - 2)执行此过程。
为此,我首先将 mz 和 rt 值分离到两个单独的文本文件中,然后创建一个 2d 双精度数组并从这两个文件填充数组(这可能是一种不必要的方法,但我的脚本级别非常低)。这样做之后,我然后使用 if 和 for 条件遍历数组以找到彼此相差 2 rt 以内的 mz 值并计算它们之间的差异。到目前为止,这是我在 java 中编写的脚本:-
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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;
public class qexactiveDiff {
public static void main(String[] args) throws IOException {
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("Data");
Sheet sheet2 = wb.createSheet("AdditionalData");
double[][] mzValues = new double[6427][2];
BufferedReader mzBr = new BufferedReader(new FileReader(
"C:/Users/colles-a-l-kxc127/workspace/Maldi/src/Neg_mzs.txt"));
BufferedReader rtBr = new BufferedReader(new FileReader(
"C:/Users/colles-a-l-kxc127/workspace/Maldi/src/Neg_rts.txt"));
String mzLine = mzBr.readLine();
String rtLine = rtBr.readLine();
for (int i = 0; i < 6427; i++) {
if (mzValues != null || rtLine != null) {
mzValues[i][0] = Double.parseDouble(mzLine);
mzValues[i][1] = Double.parseDouble(rtLine);
mzLine = mzBr.readLine();
rtLine = rtBr.readLine();
}
}
for (int i = 0; i < 6427; i++) { //6427 is num of rows
Double rt = mzValues[i][1];
Double mz = mzValues[i][0];
Row row = sheet1.createRow(i);
Row row2 = sheet2.createRow(i);
Cell cell = row.createCell(0);
Cell cell2 = row2.createCell(0);
cell.setCellValue(mz);
// System.out.println("Mz: " + mz + " | " + "RT: " + rt);
for (int j = 0; j < 6427; j++) {
Double rt2 = mzValues[j][1];
Double mz2 = mzValues[j][0];
Double rtDiff = rt2 - rt;
int counter = 0;
if (rtDiff < 2 && rtDiff > -2) {
counter++;
if(counter < 255){
cell = row.createCell(j + 1);
cell.setCellValue(mz2 - mz);
}
else{
cell2 = row.createCell(j + 1);
cell2.setCellValue(mz2 - mz);
}
// System.out.println("Index: " + j + " Mz difference: "
// + (mz2 - mz) + " RT: " + rt2);
}
}
}
try {
FileOutputStream output = new FileOutputStream("Data.xls");
wb.write(output);
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
它可能有点难以遵循,因为它是非常肮脏的脚本,但我只是想让基础知识发挥作用。我注意到当我尝试执行此操作之前,由于我正在写入的数据超出了 spreadsheet 允许的列范围,因此我不断提出有关列范围的错误,因此我尝试设计一种方法一旦数据超出列范围(我通过在代码中使用计数器实现的 255 列),将继续将数据写入另一个 sheet,但我仍然收到错误消息。我知道 java 不是执行此任务的最理想工具,但它是我有一点经验的唯一语言。有没有办法以我可以克服允许的方式导出数据列范围问题?
谢谢
我会先尝试将其另存为 CSV 文本文件,然后查看总共有多少列——您可能超出了 sheet2 的限制,并且没有 sheet3 可以移动到.
或者,或者,您可以拥有任意多行 - 将数据保存到行而不是列,将它们分成 255 个块,然后 https://support.office.com/en-in/article/Switch-transpose-columns-and-rows-ed1215f5-59af-47e6-953b-0b513b094dc2
我会尽力解释我的问题,所以如果 post 的部分内容令人困惑,我深表歉意。我有两列数据,如下所示:-
为此,我首先将 mz 和 rt 值分离到两个单独的文本文件中,然后创建一个 2d 双精度数组并从这两个文件填充数组(这可能是一种不必要的方法,但我的脚本级别非常低)。这样做之后,我然后使用 if 和 for 条件遍历数组以找到彼此相差 2 rt 以内的 mz 值并计算它们之间的差异。到目前为止,这是我在 java 中编写的脚本:-
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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;
public class qexactiveDiff {
public static void main(String[] args) throws IOException {
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("Data");
Sheet sheet2 = wb.createSheet("AdditionalData");
double[][] mzValues = new double[6427][2];
BufferedReader mzBr = new BufferedReader(new FileReader(
"C:/Users/colles-a-l-kxc127/workspace/Maldi/src/Neg_mzs.txt"));
BufferedReader rtBr = new BufferedReader(new FileReader(
"C:/Users/colles-a-l-kxc127/workspace/Maldi/src/Neg_rts.txt"));
String mzLine = mzBr.readLine();
String rtLine = rtBr.readLine();
for (int i = 0; i < 6427; i++) {
if (mzValues != null || rtLine != null) {
mzValues[i][0] = Double.parseDouble(mzLine);
mzValues[i][1] = Double.parseDouble(rtLine);
mzLine = mzBr.readLine();
rtLine = rtBr.readLine();
}
}
for (int i = 0; i < 6427; i++) { //6427 is num of rows
Double rt = mzValues[i][1];
Double mz = mzValues[i][0];
Row row = sheet1.createRow(i);
Row row2 = sheet2.createRow(i);
Cell cell = row.createCell(0);
Cell cell2 = row2.createCell(0);
cell.setCellValue(mz);
// System.out.println("Mz: " + mz + " | " + "RT: " + rt);
for (int j = 0; j < 6427; j++) {
Double rt2 = mzValues[j][1];
Double mz2 = mzValues[j][0];
Double rtDiff = rt2 - rt;
int counter = 0;
if (rtDiff < 2 && rtDiff > -2) {
counter++;
if(counter < 255){
cell = row.createCell(j + 1);
cell.setCellValue(mz2 - mz);
}
else{
cell2 = row.createCell(j + 1);
cell2.setCellValue(mz2 - mz);
}
// System.out.println("Index: " + j + " Mz difference: "
// + (mz2 - mz) + " RT: " + rt2);
}
}
}
try {
FileOutputStream output = new FileOutputStream("Data.xls");
wb.write(output);
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
它可能有点难以遵循,因为它是非常肮脏的脚本,但我只是想让基础知识发挥作用。我注意到当我尝试执行此操作之前,由于我正在写入的数据超出了 spreadsheet 允许的列范围,因此我不断提出有关列范围的错误,因此我尝试设计一种方法一旦数据超出列范围(我通过在代码中使用计数器实现的 255 列),将继续将数据写入另一个 sheet,但我仍然收到错误消息。我知道 java 不是执行此任务的最理想工具,但它是我有一点经验的唯一语言。有没有办法以我可以克服允许的方式导出数据列范围问题?
谢谢
我会先尝试将其另存为 CSV 文本文件,然后查看总共有多少列——您可能超出了 sheet2 的限制,并且没有 sheet3 可以移动到.
或者,或者,您可以拥有任意多行 - 将数据保存到行而不是列,将它们分成 255 个块,然后 https://support.office.com/en-in/article/Switch-transpose-columns-and-rows-ed1215f5-59af-47e6-953b-0b513b094dc2