好的我在经过这么多研究后发布了这个,所有有类似问题的主题都没有回答我的。我收到一个.xls文件来处理它(我无法更改它的版本)当我用poi读取文件时我有一个非常奇怪的行为,它无法读取原始文件:"无效的标题签名;读取0x54535543092E4F4E,预期0xE11AB1A1E011CFD0 - 您的文件似乎不是有效的OLE2文档" 但当我打开它并将其保存为.xls文件时,它的工作原理!它是相同版本的同一个文件,只有一个是原始下载文件,另一个是手动保存!!谁能解释我这个,我必须使用原来的excel文件。
File xlsFile = new File(path);
FileInputStream fis = new FileInputStream(path);
Workbook workbook = new HSSFWorkbook(fis);
答案 0 :(得分:3)
该签名看起来像(开头)制表符分隔数据,反过来:
NO x的。标签> CUST
其中< tab>表示实际的制表符。
如果是制表符分隔数据,Apache POI将无法直接使用它。
答案 1 :(得分:2)
所以我终于找到了最好的解决方案,我想用openCSV库从我的Tab分离文件中读取和导入数据,并且它适用于所有类型的CSV文件(字符分隔值)和标题,我们只需要更改分隔符。这是代码:
File xlsFile = new File(path);
CSVReader reader = new CSVReader(new FileReader(xlsFile), '\t');
ArrayList<String[]> data = new ArrayList<String[]>();
String[] nextLine;
while ((nextLine = reader.readNext()) != null) {
final int size = nextLine.length;
//handle empty lines
if (size == 0) {
continue;
}
String debut = nextLine[0].trim();
if (debut.length() == 0 && size == 1) {
continue;
}
data.add(nextLine);
}
String[] titles = data.get(0);
data.remove(0);
ArrayList<Map<String, String>> mappedData = new
ArrayList<Map<String, String>>(data.size());
final int titlesLength = titles.length;
for (String[] oneData : data) {
final Map<String, String> map = new HashMap<String, String ();
for (int i = 0; i < titlesLength; i++) {
final String key = titles[i];
final String value = oneData[i];
map.put(key, value);
}
mappedData.add(map);
}
然后我们必须通过他们的键(在我的情况下为标题或列名称)从mappedData获取值