gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:21:40 24 4
gpt4 key购买 nike

需要能够读取使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com