c# - 读取使用 FileUpload 控件上传的 Excel 文件而不将其保存在服务器上

标签 c# .net vb.net excel file-upload

需要能够读取使用 ASP.NET 中的 FileUploadControl 上传的 Excel 文件。该解决方案将托管在服务器上。我不想将 Excel 文件存储在服务器上。 我想直接将excel内容转换成数据集或数据表来使用。

以下是我已经找到但对我不起作用的两个解决方案。

  1. LINQTOEXCEL - 当您在本地计算机上有一个 excel 文件并且您正在本地计算机上运行代码时,此方法有效。在我的例子中,用户试图使用托管在服务器上的网页从他的本地机器上传一个 excel 文件。

  2. ExcelDataReader - 我目前正在使用这个,但这是第三方工具。我无法将其移交给我们的客户。此外,如果行/列交集带有公式,则该行/列交集的数据不会被读入数据集。

当 excel 和 .NET 解决方案在同一台机器上时,我在 google 和 StackOverflow 上找到的大多数建议都有效。但在我的情况下,当解决方案托管在服务器上时,我需要它工作,并且用户试图使用本地计算机上的托管网页上传 excel。 如果您有任何其他建议,请告诉我好吗?

最佳答案

您可以使用 InputStream HttpPostedFile 的属性将文件读入内存。

下面的示例展示了如何使用 EPPlusHttpPostedFileIO.Stream 创建一个 DataTable :

protected void UploadButton_Click(Object sender, EventArgs e)
{
    if (FileUpload1.HasFile && Path.GetExtension(FileUpload1.FileName) == ".xlsx")
    {
        using (var excel = new ExcelPackage(FileUpload1.PostedFile.InputStream))
        {
            var tbl = new DataTable();
            var ws = excel.Workbook.Worksheets.First();
            var hasHeader = true;  // adjust accordingly
            // add DataColumns to DataTable
            foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
                tbl.Columns.Add(hasHeader ? firstRowCell.Text
                    : String.Format("Column {0}", firstRowCell.Start.Column));

            // add DataRows to DataTable
            int startRow = hasHeader ? 2 : 1;
            for (int rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
            {
                var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
                DataRow row = tbl.NewRow();
                foreach (var cell in wsRow)
                    row[cell.Start.Column - 1] = cell.Text;
                tbl.Rows.Add(row);
            }
            var msg = String.Format("DataTable successfully created from excel-file. Colum-count:{0} Row-count:{1}",
                                    tbl.Columns.Count, tbl.Rows.Count);
            UploadStatusLabel.Text = msg;
        }
    }
    else 
    {
        UploadStatusLabel.Text = "You did not specify a file to upload.";
    }
}

这是 VB.NET 版本:

Sub UploadButton_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    If (FileUpload1.HasFile AndAlso IO.Path.GetExtension(FileUpload1.FileName) = ".xlsx") Then
        Using excel = New ExcelPackage(FileUpload1.PostedFile.InputStream)
            Dim tbl = New DataTable()
            Dim ws = excel.Workbook.Worksheets.First()
            Dim hasHeader = True ' change it if required '
            ' create DataColumns '
            For Each firstRowCell In ws.Cells(1, 1, 1, ws.Dimension.End.Column)
                tbl.Columns.Add(If(hasHeader,
                                   firstRowCell.Text,
                                   String.Format("Column {0}", firstRowCell.Start.Column)))
            Next
            ' add rows to DataTable '
            Dim startRow = If(hasHeader, 2, 1)
            For rowNum = startRow To ws.Dimension.End.Row
                Dim wsRow = ws.Cells(rowNum, 1, rowNum, ws.Dimension.End.Column)
                Dim row = tbl.NewRow()
                For Each cell In wsRow
                    row(cell.Start.Column - 1) = cell.Text
                Next
                tbl.Rows.Add(row)
            Next
            Dim msg = String.Format("DataTable successfully created from excel-file Colum-count:{0} Row-count:{1}",
                                    tbl.Columns.Count, tbl.Rows.Count)
            UploadStatusLabel.Text = msg
        End Using
    Else
        UploadStatusLabel.Text = "You did not specify an excel-file to upload."
    End If
End Sub

为了完整起见,这里是aspx:

<div>
   <h4>Select a file to upload:</h4>

   <asp:FileUpload id="FileUpload1"                 
       runat="server">
   </asp:FileUpload>

   <br /><br />

   <asp:Button id="UploadButton" 
       Text="Upload file"
       OnClick="UploadButton_Click"
       runat="server">
   </asp:Button>    

   <hr />

   <asp:Label id="UploadStatusLabel"
       runat="server">
   </asp:Label>        
</div>

关于c# - 读取使用 FileUpload 控件上传的 Excel 文件而不将其保存在服务器上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12420310/

相关文章:

c# - 使用 IOC 解析 View 和 ViewModel

c# - 如何为具有多个目标的 CSPROJ 生成 XML 文档

c# - 带 MVVM + WPF 的纯 DI

vb.net - LINQ to Objects - 祖 parent 、 parent 、子女关系

asp.net-mvc - 在 SharpArchitecture 的 VB.Net 转换中实现 StructureMap 的问题

c# - 将 lambda 表达式用于事件处理程序的最佳实践

c# - 打印 WebBrowser 控件内容

c# - 如何检测 .NET 中的电子邮件大小问题

c# - 使用 C# 和 .NET 从集会下载附件

c++ - 来自 .dll 的函数在 vb.net 中失败,但在 vb6 中有效