2013-07-03 98 views
0

我想上傳一個Excel工作表並將其保存爲文本文件,然後從該文本文件中讀取。我的一個朋友在他的應用程序中實現了這個功能,並且工作正常。我只是複製他的代碼,但它沒有適當地與我合作。它保存Excel工作表爲文本文件,但是當我打開文本文件時,我發現了數據損壞和大量的Unicode或奇怪的符號與許多不必要的線路,如:如何將此Excel工作表保存爲asp.net中的文本文件(.txt)?

  ;   þÿÿÿ þÿÿÿ : 

ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ

ASP.NET代碼:

<asp:FileUpload ID="Upload" runat="server" /> 
<asp:Button ID="btn_upload" runat="server" Text="Upload" OnClick="UploadButton_Click" /> 
<asp:Label ID="Label1" runat="server" /> 

C#代碼:

protected void UploadButton_Click(object sender, EventArgs e) 
    { 
     if (Upload.HasFile) 
     { 
      try 
      { 
       Upload.SaveAs(Server.MapPath("~/Files/Test_" + DateTime.Now.Year + "_" + DateTime.Now.Month + ".txt")); 
       LabelUpload.Text = "Upload File Name: " + Upload.PostedFile.FileName + "<br>" + "Type: " + Upload.PostedFile.ContentType + " File Size: " + Upload.PostedFile.ContentLength + " kb<br>"; 

       string filename = Server.MapPath("~/Files/Test_" + DateTime.Now.Year + "_" + DateTime.Now.Month + ".txt"); 
       if (System.IO.File.Exists(filename)) 
       { 
        LabelUpload.Text = LabelUpload.Text + "Uploaded Successfully"; 
       } 
      } 
      catch (Exception ex) 
      { 
       Label1.Text = "Error: " + ex.Message.ToString(); 
      } 
     } 

     else 
     { 
      LabelUpload.Text = "Please select a file to upload."; 

     } 
    } 

我使用ASP.NET 4與C#,所以請你告訴我,我應該能夠在Excel工作表保存爲txt文件,然後從它讀?

+0

同樣的事情發生當你拿一個Excel文檔並將擴展名改爲txt時。您需要一個實際能夠打開/讀取Office文檔的擴展,然後將內容解析爲簡單文本。無論如何,最終的實現將需要比你在這裏更復雜。 – MadHenchbot

+3

請注意答案,但不要使用Office Interop來實現它們。從ASP.NET或其他服務器技術使用Office Interop是一個可怕的想法。這些API被編寫用於桌面應用程序,用於自動化Office(一套桌面應用程序)。服務器應用程序在許多方面有所不同,因此在其中使用Office Interop是非常非常糟糕的主意。它也不受Microsoft的支持,並可能違反您的Office許可證。請參閱[服務器端自動化Office的注意事項](http://support.microsoft.com/kb/257757) –

回答

2

不能以文本格式保存Excel文件,你需要使用.csv延伸,而不是使用XLSX或XLS,並將其保存爲.txt

5

爲了使Excel文件在文本編輯器中可讀,必須將其轉換爲CSV文件格式。這是因爲.xlsx Excel文檔(2007+)是複雜的XML層次結構。如果您想了解真正構成.xlsx文件的內容,請將其擴展名更改爲.zip,然後將其解壓縮。

因此,您將無法簡單地將.xlsx文件的擴展名更改爲.txt或.csv,並希望它在文本編輯器中可讀。您必須以這種格式從頭開始保存文件。

在Excel中,將電子表格保存爲.csv而不是.xlsx,然後您可以立即將其打開到文本編輯器中!如果您真的想要,甚至可以將擴展名更改爲.txt。

如果您不告訴Excel將其自身保存爲純文本而不是其正常的XML結構,那麼這些都不會奏效。

如果你堅持支持.xlsx文件,有一種方法。 Office XML文件格式是一種開放和公開的格式,允許您按自己的喜好操縱它。

你將需要:

  1. Download The Open XML SDK

  2. 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; 
} 

從那裏,可以做任何你與單元格值喜歡=)

相關問題