大家好 我是一个刚出道的java程序员 水平不是很好 因为今天遇到了一个问题 搜索了很久 实在是找不到答案了 只好壮着胆子在这里注册了个帐号 把问题提上来 希望有过相关经验的前辈们能给一个答复
问题是这样的 有一个fundvalue-1.xls文件用记事本打开显示如下:
<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<Worksheet ss:Name="博时价值(050001)">
<Table>
<Row>
<Cell><Data ss:Type="String">日期</Data></Cell>
<Cell><Data ss:Type="String">单位净值</Data></Cell>
<Cell><Data ss:Type="String">累计净值</Data></Cell>
<Cell><Data ss:Type="String">日增长率</Data></Cell>
<Cell><Data ss:Type="String">日增长值</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">2007-03-30</Data></Cell>
<Cell><Data ss:Type="Number">1.0500</Data></Cell>
<Cell><Data ss:Type="Number">2.7700</Data></Cell>
<Cell><Data ss:Type="Number">-0.47</Data></Cell>
<Cell><Data ss:Type="Number">-0.0050</Data></Cell>
</Row>
</Table>
</Worksheet>
<Worksheet ss:Name="博时精选(050004)">
<Table>
<Row>
<Cell><Data ss:Type="String">日期</Data></Cell>
<Cell><Data ss:Type="String">单位净值</Data></Cell>
<Cell><Data ss:Type="String">累计净值</Data></Cell>
<Cell><Data ss:Type="String">日增长率</Data></Cell>
<Cell><Data ss:Type="String">日增长值</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">2007-03-30</Data></Cell>
<Cell><Data ss:Type="Number">1.0573</Data></Cell>
<Cell><Data ss:Type="Number">2.4473</Data></Cell>
<Cell><Data ss:Type="Number">-0.16</Data></Cell>
<Cell><Data ss:Type="Number">-0.0017</Data></Cell>
</Row>
</Table>
</Worksheet>
</Workbook>
相信大家已经看出来了这是一个xml格式的文件 但它的文件扩展名是.xls也就是Excel文件 如果用Excel打开该文件就只会显示标签里的内容 如果用记事本或EditPlus打开就是上面的样子 现在想要实现的是获取这个文件里的数据 本来我已经通过dom4j读xml的方法得到了该文件里的内容 程序如下:
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;
public class ReadXML {
private File xmlFile;
public void readFile(String path){
try{
xmlFile=new File(path);
SAXReader reader=new SAXReader();
Document xmlDoc=reader.read(xmlFile);
HashMap xmlMap = new HashMap();
xmlMap.put("ss","urn:schemas-microsoft-com:office:spreadsheet");
XPath at = xmlDoc.createXPath("//ss:Worksheet");
at.setNamespaceURIs(xmlMap);
List atresult = at.selectNodes(xmlDoc);
for(Iterator atiter=atresult.iterator();atiter.hasNext();){
Element atelement=(Element)atiter.next();
System.out.println(atelement.attribute(0).getValue());
}
XPath el = xmlDoc.createXPath("//ss:Data");
el.setNamespaceURIs(xmlMap);
List result = el.selectNodes(xmlDoc);
for(Iterator iter=result.iterator();iter.hasNext();){
Element element=(Element)iter.next();
if(!(element.getText().equals("数据提供:基金互动网(http://www.fundxy.com)"))){
System.out.println(element.getText());
}
}
}catch(Exception e){
System.out.print(e.getMessage());
}
}
public static void main(String[] args) {
String path="c:/fundvalue-1.xls";
ReadXML OB = new ReadXML();
OB.readFile(path);
}
}
但因为该文件是以.xls结尾的 也就是说可以通过Excel访问 那这样的话我想通过java的扩展类jxl也应该可以访问 所以就查阅相关资料写了个程序试了一下 代码如下:
import java.io.File;
import java.io.IOException;
import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
public class JXL {
public void readFile(String path){
Workbook workbook = null;
try {
workbook = Workbook.getWorkbook(new File(path));
}catch(BiffException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
Sheet[] sheet = workbook.getSheets();
Cell cell = null;
for(int k=0;k<sheet.length;k++){
for (int i = 0; i <sheet[k].getRows(); i++) {
for (int j = 0; j <sheet[k].getColumns(); j++) {
cell=sheet[k].getCell(j, i);
if(cell.getType()==CellType.NUMBER){
System.out.print(((NumberCell)cell).getValue());
}
else if(cell.getType()==CellType.DATE){
System.out.print(((DateCell)cell).getDate());
}
else{
System.out.print(cell.getContents());
}
System.out.print("\t");
}
System.out.print("\n");
}
}
workbook.close();
}
public static void main(String[] args){
String path="c:/fundvalue-1.xls";
JXL OB=new JXL();
OB.readFile(path);
}
}
执行的时候workbook = Workbook.getWorkbook(new File(path));这句报错: jxl.read.biff.BiffException: Unable to recognize OLE stream 估计是找不到或无法读取fundvalue-1.xls这个文件
后来我尝试的换了一个普通的xls文件(不是像上面的那种xml形式的xls文件)发现一切运行正常可以输出结果 所以我猜可能是jxl对上面那种xml形式的xls文件无法读取 不知道我的判断是否正确 难道jxl真的就对上面那种xml形式的xls文件没办法了么?请各位有相关经验的高手指教 在这里先谢谢大家了 ^_^
问题是这样的 有一个fundvalue-1.xls文件用记事本打开显示如下:
<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<Worksheet ss:Name="博时价值(050001)">
<Table>
<Row>
<Cell><Data ss:Type="String">日期</Data></Cell>
<Cell><Data ss:Type="String">单位净值</Data></Cell>
<Cell><Data ss:Type="String">累计净值</Data></Cell>
<Cell><Data ss:Type="String">日增长率</Data></Cell>
<Cell><Data ss:Type="String">日增长值</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">2007-03-30</Data></Cell>
<Cell><Data ss:Type="Number">1.0500</Data></Cell>
<Cell><Data ss:Type="Number">2.7700</Data></Cell>
<Cell><Data ss:Type="Number">-0.47</Data></Cell>
<Cell><Data ss:Type="Number">-0.0050</Data></Cell>
</Row>
</Table>
</Worksheet>
<Worksheet ss:Name="博时精选(050004)">
<Table>
<Row>
<Cell><Data ss:Type="String">日期</Data></Cell>
<Cell><Data ss:Type="String">单位净值</Data></Cell>
<Cell><Data ss:Type="String">累计净值</Data></Cell>
<Cell><Data ss:Type="String">日增长率</Data></Cell>
<Cell><Data ss:Type="String">日增长值</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">2007-03-30</Data></Cell>
<Cell><Data ss:Type="Number">1.0573</Data></Cell>
<Cell><Data ss:Type="Number">2.4473</Data></Cell>
<Cell><Data ss:Type="Number">-0.16</Data></Cell>
<Cell><Data ss:Type="Number">-0.0017</Data></Cell>
</Row>
</Table>
</Worksheet>
</Workbook>
相信大家已经看出来了这是一个xml格式的文件 但它的文件扩展名是.xls也就是Excel文件 如果用Excel打开该文件就只会显示标签里的内容 如果用记事本或EditPlus打开就是上面的样子 现在想要实现的是获取这个文件里的数据 本来我已经通过dom4j读xml的方法得到了该文件里的内容 程序如下:
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;
public class ReadXML {
private File xmlFile;
public void readFile(String path){
try{
xmlFile=new File(path);
SAXReader reader=new SAXReader();
Document xmlDoc=reader.read(xmlFile);
HashMap xmlMap = new HashMap();
xmlMap.put("ss","urn:schemas-microsoft-com:office:spreadsheet");
XPath at = xmlDoc.createXPath("//ss:Worksheet");
at.setNamespaceURIs(xmlMap);
List atresult = at.selectNodes(xmlDoc);
for(Iterator atiter=atresult.iterator();atiter.hasNext();){
Element atelement=(Element)atiter.next();
System.out.println(atelement.attribute(0).getValue());
}
XPath el = xmlDoc.createXPath("//ss:Data");
el.setNamespaceURIs(xmlMap);
List result = el.selectNodes(xmlDoc);
for(Iterator iter=result.iterator();iter.hasNext();){
Element element=(Element)iter.next();
if(!(element.getText().equals("数据提供:基金互动网(http://www.fundxy.com)"))){
System.out.println(element.getText());
}
}
}catch(Exception e){
System.out.print(e.getMessage());
}
}
public static void main(String[] args) {
String path="c:/fundvalue-1.xls";
ReadXML OB = new ReadXML();
OB.readFile(path);
}
}
但因为该文件是以.xls结尾的 也就是说可以通过Excel访问 那这样的话我想通过java的扩展类jxl也应该可以访问 所以就查阅相关资料写了个程序试了一下 代码如下:
import java.io.File;
import java.io.IOException;
import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
public class JXL {
public void readFile(String path){
Workbook workbook = null;
try {
workbook = Workbook.getWorkbook(new File(path));
}catch(BiffException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
Sheet[] sheet = workbook.getSheets();
Cell cell = null;
for(int k=0;k<sheet.length;k++){
for (int i = 0; i <sheet[k].getRows(); i++) {
for (int j = 0; j <sheet[k].getColumns(); j++) {
cell=sheet[k].getCell(j, i);
if(cell.getType()==CellType.NUMBER){
System.out.print(((NumberCell)cell).getValue());
}
else if(cell.getType()==CellType.DATE){
System.out.print(((DateCell)cell).getDate());
}
else{
System.out.print(cell.getContents());
}
System.out.print("\t");
}
System.out.print("\n");
}
}
workbook.close();
}
public static void main(String[] args){
String path="c:/fundvalue-1.xls";
JXL OB=new JXL();
OB.readFile(path);
}
}
执行的时候workbook = Workbook.getWorkbook(new File(path));这句报错: jxl.read.biff.BiffException: Unable to recognize OLE stream 估计是找不到或无法读取fundvalue-1.xls这个文件
后来我尝试的换了一个普通的xls文件(不是像上面的那种xml形式的xls文件)发现一切运行正常可以输出结果 所以我猜可能是jxl对上面那种xml形式的xls文件无法读取 不知道我的判断是否正确 难道jxl真的就对上面那种xml形式的xls文件没办法了么?请各位有相关经验的高手指教 在这里先谢谢大家了 ^_^
xml有一定的规则,因为office是支持xml的,但是java的第三方类可能就没办法了