서버에 저장하지 않고 FileUpload Control을 사용하여 업로드된 Excel 파일을 읽습니다.
ASP의 FileUploadControl을 사용하여 업로드된 Excel 파일을 읽을 수 있어야 합니다.NET. 솔루션은 서버에서 호스트됩니다.엑셀 파일을 서버에 저장하고 싶지 않습니다.엑셀 콘텐츠를 데이터셋이나 데이터 테이블로 직접 변환하여 활용하고 싶습니다.
아래는 이미 찾았지만 나에게는 효과가 없을 것 같은 두 가지 해결책입니다.
LINQTOEXCEL - 이 메서드는 로컬머신에 Excel 파일이 있고 로컬머신에서 코드를 실행하고 있을 때 사용할 수 있습니다.제 경우 사용자가 서버에서 호스팅되는 웹 페이지를 사용하여 로컬 머신에서 엑셀 파일을 업로드하려고 합니다.
Excel Data Reader - 현재 사용하고 있습니다만, 서드파티 툴입니다.저는 이것을 고객에게 옮길 수 없습니다.또한 행/열 교차로가 공식을 전달하는 경우 해당 행/열 교차로의 데이터가 데이터 집합으로 읽히지 않습니다.
구글과 StackOverflow에서 찾은 제안의 대부분은 Excel과 가 모두 동작합니다.NET 솔루션은 같은 머신상에 있습니다.다만, 저는 솔루션이 서버상에서 호스트 되고 있는 경우, 유저가 로컬 머신상에서 호스트 되고 있는 Web 페이지를 사용해 엑셀을 업 로드하려고 하고 있는 경우에, 이 기능이 필요합니다.다른 의견이 있으시면 알려주시겠습니까?
의 속성을 사용할 수 있습니다.HttpPostedFile
파일을 메모리에 읽습니다.
다음 예시는 다음 예시를 보여 줍니다.DataTable
에서IO.Stream
의HttpPostedFile
사용:
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>
//Best Way To read file direct from stream
IExcelDataReader excelReader = null;
//file.InputStream is the file stream stored in memeory by any ways like by upload file control or from database
int excelFlag = 1; //this flag us used for execl file format .xls or .xlsx
if (excelFlag == 1)
{
//1. Reading from a binary Excel file ('97-2003 format; *.xls)
excelReader = ExcelReaderFactory.CreateBinaryReader(file.InputStream);
}
else if(excelFlag == 2)
{
//2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
excelReader = ExcelReaderFactory.CreateOpenXmlReader(file.InputStream);
}
if (excelReader != null)
{
//...
//3. DataSet - The result of each spreadsheet will be created in the result.Tables
ds = excelReader.AsDataSet();
//...
////4. DataSet - Create column names from first row
//excelReader.IsFirstRowAsColumnNames = true;
//DataSet result = excelReader.AsDataSet();
////5. Data Reader methods
//while (excelReader.Read())
//{
// //excelReader.GetInt32(0);
//}
//6. Free resources (IExcelDataReader is IDisposable)
excelReader.Close();
}
MVC에서 ClosedXML을 사용하여 이를 수행하는 방법은 다음과 같습니다.엑셀. 이 답변이 너무 늦었다는 건 알아요.구글링 문제 후 이 페이지에 접속하는 모든 분들을 위해 이 답을 넣고 싶었습니다.Visual Studio에서 도구 메뉴를 클릭하고 NuGet Package Manager를 확장한 다음 Package Manager 콘솔을 실행합니다.다음 명령을 입력합니다.
Install-Package ClosedXML
모델:
namespace ExcelUploadFileDemo.Models
{
public class UploadFile
{
[Required]
public HttpPostedFileBase ExcelFile { get; set; }
}
}
컨트롤러:
namespace ExcelUploadFileDemo.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
UploadFile UploadFile = new UploadFile();
return View(UploadFile);
}
[HttpPost]
public ActionResult Index(UploadFile UploadFile)
{
if (ModelState.IsValid)
{
if (UploadFile.ExcelFile.ContentLength > 0)
{
if (UploadFile.ExcelFile.FileName.EndsWith(".xlsx") || UploadFile.ExcelFile.FileName.EndsWith(".xls"))
{
XLWorkbook Workbook;
Try//incase if the file is corrupt
{
Workbook = new XLWorkbook(UploadFile.ExcelFile.InputStream);
}
catch (Exception ex)
{
ModelState.AddModelError(String.Empty, $"Check your file. {ex.Message}");
return View();
}
IXLWorksheet WorkSheet = null;
Try//incase if the sheet you are looking for is not found
{
WorkSheet = Workbook.Worksheet("sheet1");
}
catch
{
ModelState.AddModelError(String.Empty, "sheet1 not found!");
return View();
}
WorkSheet.FirstRow().Delete();//if you want to remove ist row
foreach (var row in WorkSheet.RowsUsed())
{
//do something here
row.Cell(1).Value.ToString();//Get ist cell. 1 represent column number
}
}
else
{
ModelState.AddModelError(String.Empty, "Only .xlsx and .xls files are allowed");
return View();
}
}
else
{
ModelState.AddModelError(String.Empty, "Not a valid file");
return View();
}
}
return View();
}
}
}
이 링크에는 다양한 엑셀 처리 방법을 보여주는 예가 많이 있습니다.
https://github.com/ClosedXML/ClosedXML/tree/9ac4d868a313f308b82e94617b9cc2d28baeb1c3/ClosedXML
표시
@model ExcelUploadFileDemo.Models.UploadFile
@{
ViewBag.Title = "Upload Excel File";
}
<h2>Upload an Excel File</h2>
@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="form-horizontal">
@Html.ValidationSummary("", new { @class = "text-danger" });
<div class="form-group">
@Html.LabelFor(model => model.ExcelFile, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(model => model.ExcelFile, new { type = "file", @class = "form-control" })
@Html.ValidationMessageFor(model => model.ExcelFile, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type = "submit" value="Submit" class="btn btn-default" />
</div>
</div>
</div>
}
Koogra를 봐주세요.이것은 오픈 소스 엑셀 리더(읽기 전용)입니다.클라이언트로부터 스트림을 받을 수 있을 거라고 생각합니다.그러면 지금처럼 모든 작업을 수행할 수 있습니다. 메모리 스트림에서 읽고 데이터베이스에 쓰십시오.
이게 도움이 됐으면 좋겠어요.
언급URL : https://stackoverflow.com/questions/12420310/read-an-excel-file-uploaded-using-fileupload-control-without-saving-it-on-the-se
'programing' 카테고리의 다른 글
매크로를 사용하여 Windows 사용자 이름을 Excel 스프레드 시트에 표시하려면 어떻게 해야 합니까? (0) | 2023.04.13 |
---|---|
Excel 탭 시트 이름과Visual Basic 시트 이름 (0) | 2023.04.13 |
printf에서 색상 사용 (0) | 2023.04.13 |
콘솔에서 Rails SQL 로깅 사용 안 함 (0) | 2023.04.13 |
UIImageView 이미지 변경 시 페이드/해체 (0) | 2023.04.13 |