0

Excelシートをアップロードしてテキストファイルとして保存し、そのテキストファイルから読み取ろうとしています。私の友人の 1 人が彼のアプリケーションでこのように実装し、正常に動作しています。彼のコードをコピーしただけですが、うまく動作しませんでした。Excelシートをテキストファイルとして保存しましたが、テキストファイルを開くと、データが破損しており、多くのUnicodeまたは奇妙なシンボルが次のような多くの不要な行で見つかりました。

          ;          þÿÿÿ    þÿÿÿ    :  

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

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.";

        }
    }

私は C# で ASP.NET 4 を使用しています。Excel シートを txt ファイルとして保存し、そこから読み取るにはどうすればよいか教えてください。

4

2 に答える 2

5

Excel ファイルをテキスト エディターで読み取るには、CSV ファイル形式に変換する必要があります。これは、.xlsx Excel ドキュメント (2007 以降) が複雑な XML 階層であるためです。.xlsx ファイルの実際の構成を知りたい場合は、拡張子を .zip に変更してから解凍してください。

したがって、単純に .xlsx ファイルの拡張子を .txt または .csv に変更して、テキスト エディターで読み取れるようにすることはできません。最初からこのような形式でファイルを保存する必要があります。

Excel では、スプレッドシートを .xlsx ではなく .csv として保存すると、すぐにテキスト エディターで開くことができます。必要に応じて、拡張子を .txt に変更することもできます。

通常の XML 構造ではなくプレーン テキストとして Excel 自体を保存するように指示しないと、どれもうまくいきません。

.xlsx ファイルのサポートに固執している場合は、方法があります。Office XML ファイル形式はオープンで公開された形式であり、好きなように操作できます。

次のことを行う必要があります。

  1. Open XML SDK をダウンロード

  2. ドキュメントを注意深く読む

あなたの場合、おそらく特定のセル値にアクセスし、その内容を読み取り、それらを新しいファイルにストリーミングしたいと思うでしょう。

上記のドキュメントでは、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;
}

そこから、セル値で好きなことを行うことができます =)

于 2013-07-03T18:48:48.680 に答える
2

Excelファイルをテキスト形式で保存することはできません.csv.xlsx、またはxlsを使用する代わりに拡張子を使用して、として保存する必要があり.txtます.

于 2013-07-03T18:37:52.570 に答える