爲了使Excel文件在文本編輯器中可讀,必須將其轉換爲CSV文件格式。這是因爲.xlsx Excel文檔(2007+)是複雜的XML層次結構。如果您想了解真正構成.xlsx文件的內容,請將其擴展名更改爲.zip,然後將其解壓縮。
因此,您將無法簡單地將.xlsx文件的擴展名更改爲.txt或.csv,並希望它在文本編輯器中可讀。您必須以這種格式從頭開始保存文件。
在Excel中,將電子表格保存爲.csv而不是.xlsx,然後您可以立即將其打開到文本編輯器中!如果您真的想要,甚至可以將擴展名更改爲.txt。
如果您不告訴Excel將其自身保存爲純文本而不是其正常的XML結構,那麼這些都不會奏效。
如果你堅持支持.xlsx文件,有一種方法。 Office XML文件格式是一種開放和公開的格式,允許您按自己的喜好操縱它。
你將需要:
Download The Open XML SDK
Carefully read the documentation
在你的情況,你可能會想訪問特定的單元格的值,讀取其內容,然後將它們流入一個新文件。
上述文檔提供下面的代碼片斷爲一個Excel文檔中訪問單元值:
public static string XLGetCellValue(string fileName, string sheetName, string addressName)
{
const string worksheetSchema = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
const string sharedStringSchema = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
string cellValue = null;
// Retrieve the stream containing the requested
// worksheet's info.
using (SpreadsheetDocument xlDoc = SpreadsheetDocument.Open(fileName, false))
{
// Get the main document part (workbook.xml).
XmlDocument doc = new XmlDocument();
doc.Load(xlDoc.WorkbookPart.GetStream());
// Create a namespace manager, so you can search.
// Add a prefix (d) for the default namespace.
NameTable nt = new NameTable();
XmlNamespaceManager nsManager = new XmlNamespaceManager(nt);
nsManager.AddNamespace("d", worksheetSchema);
nsManager.AddNamespace("s", sharedStringSchema);
string searchString = string.Format("//d:sheet[@name='{0}']", sheetName);
XmlNode sheetNode = doc.SelectSingleNode(searchString, nsManager);
if (sheetNode != null)
{
// Get the relId attribute.
XmlAttribute relationAttribute = sheetNode.Attributes["r:id"];
if (relationAttribute != null)
{
string relId = relationAttribute.Value;
// Load the contents of the workbook.
XmlDocument sheetDoc = new XmlDocument(nt);
sheetDoc.Load(xlDoc.WorkbookPart.GetPartById(relId).GetStream());
XmlNode cellNode = sheetDoc.SelectSingleNode(string.Format("//d:sheetData/d:row/d:c[@r='{0}']", addressName), nsManager);
if (cellNode != null)
{
XmlAttribute typeAttr = cellNode.Attributes["t"];
string cellType = string.Empty;
if (typeAttr != null)
{
cellType = typeAttr.Value;
}
XmlNode valueNode = cellNode.SelectSingleNode("d:v", nsManager);
if (valueNode != null)
{
cellValue = valueNode.InnerText;
}
if (cellType == "b")
{
if (cellValue == "1")
{
cellValue = "TRUE";
}
else
{
cellValue = "FALSE";
}
}
else if (cellType == "s")
{
if (xlDoc.WorkbookPart.SharedStringTablePart != null)
{
XmlDocument stringDoc = new XmlDocument(nt);
stringDoc.Load(xlDoc.WorkbookPart.SharedStringTablePart.GetStream());
// Add the string schema to the namespace manager.
nsManager.AddNamespace("s", sharedStringSchema);
int requestedString = Convert.ToInt32(cellValue);
string strSearch = string.Format("//s:sst/s:si[{0}]", requestedString + 1);
XmlNode stringNode = stringDoc.SelectSingleNode(strSearch, nsManager);
if (stringNode != null)
{
cellValue = stringNode.InnerText;
}
}
}
}
}
}
}
return cellValue;
}
從那裏,可以做任何你與單元格值喜歡=)
同樣的事情發生當你拿一個Excel文檔並將擴展名改爲txt時。您需要一個實際能夠打開/讀取Office文檔的擴展,然後將內容解析爲簡單文本。無論如何,最終的實現將需要比你在這裏更復雜。 – MadHenchbot
請注意答案,但不要使用Office Interop來實現它們。從ASP.NET或其他服務器技術使用Office Interop是一個可怕的想法。這些API被編寫用於桌面應用程序,用於自動化Office(一套桌面應用程序)。服務器應用程序在許多方面有所不同,因此在其中使用Office Interop是非常非常糟糕的主意。它也不受Microsoft的支持,並可能違反您的Office許可證。請參閱[服務器端自動化Office的注意事項](http://support.microsoft.com/kb/257757) –