Java 我想读取excel并写入文本,以便我的第一个单元格是键,其余单元格是值
我正在使用apachePOI读取excel文件,我希望以这样的方式编写它:我的头将是一个文本文件名,它将迭代到每个单元格以生成一个具有头名称的新文件 我已经试过了,但没有办法做到Java 我想读取excel并写入文本,以便我的第一个单元格是键,其余单元格是值,java,apache-poi,Java,Apache Poi,我正在使用apachePOI读取excel文件,我希望以这样的方式编写它:我的头将是一个文本文件名,它将迭代到每个单元格以生成一个具有头名称的新文件 我已经试过了,但没有办法做到 public static final String FILE_PATH = "C:\\Temp\\rest\\p.xlsx"; public static void main(String[] args) throws IOException, InvalidFormatException { String
public static final String FILE_PATH = "C:\\Temp\\rest\\p.xlsx";
public static void main(String[] args) throws IOException, InvalidFormatException {
String value = null;
String key = null;
Cell keyCell = null;
Workbook workbook = null;
Cell valueCell = null;
try {
workbook = WorkbookFactory.create(new File(FILE_PATH));
} catch (EncryptedDocumentException | org.apache.poi.openxml4j.exceptions.InvalidFormatException e) {
e.printStackTrace();
}
Map<String, String> data = new LinkedHashMap<String, String>();
ArrayList<String> list = new ArrayList<String>();
Iterator<Sheet> sheetIterator = workbook.sheetIterator();
while (sheetIterator.hasNext()) {
Sheet sheet = sheetIterator.next();
System.out.println("------------ " + sheet.getSheetName() + "-------------");
}
Sheet sheet = workbook.getSheetAt(0);
Iterator<Row> rowIterator = sheet.rowIterator();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
valueCell = row.getCell(1);
keyCell = row.getCell(0);
key = keyCell.getStringCellValue() + "---------";
value = valueCell.getStringCellValue().trim() + "\n";
data.put(key , value );
for (String s : data.keySet()) {
String v= data.get(s);
System.out.println(v);
}
}
File file = new File(args[0] + filename+ ".txt");
PrintWriter printWriter = new PrintWriter(file);
printWriter.write(data.toString());
workbook.close();
printWriter.close();
}
预期结果:
fnm.txt-
lnm.txt-
Key lnm
1 xyz
2 poi
我会这样做: 首先收集映射中的列标题,其中键是列索引,值是标题文本。列标题文本将是文件名。由于所有文件中始终需要第一列,因此我们使用
TreeMap
,因为firstEntry
方法可以使用
然后收集映射中的列值,其中键是列索引,值是该列中的值列表
现在我们有了所有的数据,可以将其写入文件。为此,请为列标题中高于第一列的每列映射创建一个名为与列标题文本相同的文件。然后从第一列和该列写入列标题。然后逐行写入第一列的所有列值以及该列的列值
代码:
import org.apache.poi.ss.usermodel.*;
导入java.util.*;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.PrintWriter;
类GetDataFromExcel{
公共静态void main(字符串[]args)引发异常{
工作簿=WorkbookFactory.create(新文件输入流(“ExcelExample.xlsx”);
DataFormatter DataFormatter=新的DataFormatter();
FormulaEvaluator FormulaEvaluator=工作簿.getCreationHelper().createFormulaEvaluator();
工作表=工作簿。getSheetAt(0);
int headerRowNum=sheet.getFirstRowNum();
//收集列标题
TreeMap colHeaders=newtreemap();
Row Row=sheet.getRow(headerRowNum);
用于(单元格:行){
int colIdx=cell.getColumnIndex();
字符串值=dataFormatter.formatCellValue(单元格,formulaEvaluator);
colHeaders.put(colIdx,value);
}
System.out.println(colHeaders);
//收集列值
Map colValues=newhashmap();
for(Map.Entry:colHeaders.entrySet()){
int colIdx=entry.getKey();
列表值=新的ArrayList();
对于(int r=headerRowNum+1;r values.size())?firstValues.size():values.size();
对于(int r=0;rr)?firstValues.get(r):“”;
value=(values.size()>r)?values.get(r):“”;
writer.println(firstValue+“\t”+值);
}
writer.close();
entry=colHeaders.higherEntry(entry.getKey());
}
workbook.close();
}
}
如果我了解您需要什么,您将尝试为每一列生成一个txt文件(第一列是键除外),对吗?你有什么问题?你得到了什么?我想创建一个循环,这样键(第一列)始终存在,值将从每列中逐个生成并打印为文本,因为标题将是文本文件名。第一个文件将创建为fnm.txt,并打印,每列相同-键fnm 1 john 2 sid
Key fnm
1 john
2 sid
Key lnm
1 xyz
2 poi
import org.apache.poi.ss.usermodel.*;
import java.util.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.PrintWriter;
class GetDataFromExcel {
public static void main(String[] args) throws Exception {
Workbook workbook = WorkbookFactory.create(new FileInputStream("ExcelExample.xlsx"));
DataFormatter dataFormatter = new DataFormatter();
FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
Sheet sheet = workbook.getSheetAt(0);
int headerRowNum = sheet.getFirstRowNum();
// collecting the column headers
TreeMap<Integer, String> colHeaders = new TreeMap<Integer, String>();
Row row = sheet.getRow(headerRowNum);
for (Cell cell : row) {
int colIdx = cell.getColumnIndex();
String value = dataFormatter.formatCellValue(cell, formulaEvaluator);
colHeaders.put(colIdx, value);
}
System.out.println(colHeaders);
// collecting the column values
Map<Integer, List<String>> colValues = new HashMap<Integer, List<String>>();
for (Map.Entry<Integer, String> entry : colHeaders.entrySet()) {
int colIdx = entry.getKey();
List<String> values = new ArrayList<String>();
for (int r = headerRowNum + 1; r <= sheet.getLastRowNum(); r++) {
row = sheet.getRow(r); if (row == null) row = sheet.createRow(r);
Cell cell = row.getCell(colIdx); if (cell == null) cell = row.createCell(colIdx);
String value = dataFormatter.formatCellValue(cell, formulaEvaluator);
values.add(value);
}
colValues.put(colIdx, values);
}
System.out.println(colValues);
// printing it to files
Map.Entry<Integer, String> firstColEntry = colHeaders.firstEntry();
Map.Entry<Integer, String> entry = colHeaders.higherEntry(firstColEntry.getKey());
while (entry != null) {
String fileName = "./" + entry.getValue() + ".txt";
PrintWriter writer = new PrintWriter(new File(fileName));
String firstValue = firstColEntry.getValue();
String value = entry.getValue();
writer.println(firstValue + "\t" + value);
List<String> firstValues = colValues.get(firstColEntry.getKey());
List<String> values = colValues.get(entry.getKey());
int rowCount = (firstValues.size() > values.size())?firstValues.size():values.size();
for (int r = 0; r < rowCount; r++) {
firstValue = (firstValues.size()>r)?firstValues.get(r):"";
value = (values.size()>r)?values.get(r):"";
writer.println(firstValue + "\t" + value);
}
writer.close();
entry = colHeaders.higherEntry(entry.getKey());
}
workbook.close();
}
}