我正在尝试创建一个程序,将所有数据从excel写入多个csv文件。
目前,我的程序创建了 n 个文件,并且只有excel的最后一行写入了最后一个csv文件。
似乎文件正在写入。但是对于每个写入的行,它都会以某种方式创建相同的文件250次。它将擦除最后写入的行。
使用 OutputStream 或 BufferedWriter 可能会遇到一些问题。我只是不知道那是什么。
writeRow()方法:
public static void writeRow(BufferedWriter bw, Cell[] row) throws IOException {
if (row.length > 0) {
bw.write(row[0].getContents());
for (int j = 1; j < row.length; j++) {
bw.write(',');
bw.write(row[j].getContents());
}
}
}
setFile()方法:
public static BufferedWriter setFile (int i) throws IOException {
i=i/250;
File f = new File(dir + "file-" + (i+1) + ".csv");
// If i has changed, create a new file. Else, append to current file.
String encoding = "UTF8";
OutputStream os = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
Boolean append = null;
try {
// If i has changed, create a new file, else append.
if (i%250==0) {
append = new Boolean("TRUE");
os = new FileOutputStream(f,append);
} else {
append = new Boolean("FALSE");
os = new FileOutputStream(f, append);
}
osw = new OutputStreamWriter(os, encoding);
bw = new BufferedWriter(osw);
} finally {
os.close();
osw.close();
}
return bw;
}
这是例外。
Exception in thread "main" java.io.IOException: Stream closed
at sun.nio.cs.StreamEncoder.ensureOpen(Unknown Source)
at sun.nio.cs.StreamEncoder.write(Unknown Source)
at java.io.OutputStreamWriter.write(Unknown Source)
at java.io.BufferedWriter.flushBuffer(Unknown Source)
at java.io.BufferedWriter.flush(Unknown Source)
at Main.main(Main.java:46)
以下是该代码的一些链接。
我究竟做错了什么?
这是svn中继:
https://franz-opensource.googlecode.com/svn/trunk/ExcelToCsv -
重要建议: 每 n个
记录之后,停止行,而不是在同一缓冲区上写。然后,再次阅读工作表。然后,在另一个文件上输出缓冲区。在同一缓冲区上写入时,您将无法更改文件。
以下是整个解决方案:
静态变量:
public static int maxRecords = 250;
public static String directory = "C:\\Users\\User02\\workspace\\ExcelToCsv\\src\\";
public static String inputFile = directory + "inventory.xls";
主要:
public static void main(String[] args) throws BiffException, IOException {
Sheet s = getSheet();
int countRows = s.getRows(); // counts the number of rows in the sheet.
int numberOfFiles = (countRows/maxRecords)+1;
for(int file=0; file<numberOfFiles; file++) {
System.out.println("Create file number " + (file+1));
int fileNumber = file+1;
System.out.println("Start number: " + ((file*maxRecords)+1));
int startNumber = (file*maxRecords);
populateFile(fileNumber,startNumber);
System.out.println("");
}
}
填充列表:
public static void populateFile(int fileNumber, int startNumber)
throws IOException, BiffException {
BufferedWriter bw = setFile(fileNumber);
Sheet s = getSheet();
Cell[] row = null;
writeRow(bw,s.getRow(0));
bw.newLine();
int limit = getLimit(s,startNumber);
System.out.println("End Number:" + limit);
System.out.println();
for (int i = startNumber; i < limit ; i++) {
row = s.getRow(i);
//System.out.println(i);
writeRow(bw,row);
bw.newLine();
}
bw.flush();
bw.close();
}
获取工作表:
public static Sheet getSheet() throws BiffException, IOException {
WorkbookSettings ws = new WorkbookSettings();
ws.setLocale(new Locale("en", "EN"));
Workbook w = Workbook.getWorkbook(new File(inputFile),ws);
Sheet s = w.getSheet(0);
return s;
}
设置文件写入:
public static BufferedWriter setFile(int fileNumber) throws IOException {
String csvFilename = directory + "file-"+ fileNumber +".csv";
FileWriter csvFile = new FileWriter(csvFilename);
BufferedWriter bw = new BufferedWriter(csvFile);
return bw;
}
获得极限:
public static int getLimit(Sheet s, int startNumber) {
int limit;
int countRows = s.getRows();
if (startNumber+maxRecords<=countRows) {
limit = startNumber + maxRecords;
} else {
limit = startNumber + (countRows-startNumber);
}
return limit;
}
将行写入文件:
public static void writeRow(BufferedWriter bw, Cell[] row) throws IOException {
if (row.length > 0) {
bw.write(row[0].getContents());
for (int j = 1; j < row.length; j++) {
bw.write(',');
bw.write(row[j].getContents());
}
}
}
我有一些相同列标题的CSV文件。我想把它们做成一个文件。所以我找到了和我相似的东西。链接是将CSV文件合并到一个没有重复标题的文件中。但是我想以字符串的形式返回数据,但是这段代码没有返回。我试着修改一下。但我失败了。我想把来自多个csv的数据放到一个变量中。
我正在尝试读取多个excel文件,并将每个文件中的数据附加到一个主文件中。每个文件都有相同的标题(因此我可以跳过导入初始文件后的第一行)。 我对Python和OpenPyXL模块都很陌生。我可以毫无问题地导入第一个工作簿。当我需要打开后续文件并复制数据以粘贴到原始工作表中时,我的问题就出现了。 到目前为止,这是我的代码: 谢谢!
我有保存在表中的数据(我已经从一个文件中收集了它),我想用java把它写在Excel xls文件中 我只共享主类,因为它显示了我如何将数据保存在表中
我在文本文件中插入的代码如下: 我想将所有这些数据插入到csv文件中,但我尝试了以下方法: 如何将此数据逐行插入到带有列标题的csv文件中?
我正在写一个程序,它需要从excel文件中读取和写入数据,而不考虑格式(xls或xlsx)。 我知道ApachePOI,但它似乎有不同的类来处理xls文件(HSSF)和xlsx(XSSF)文件。 任何人都知道我将如何实现我在这里的目标。(也欢迎使用POI以外的API的想法)。