2014-03-06 4 views
3

클라이언트가 서버에 업로드 한 Excel 파일을받는 중입니다. 내가 본 모든 예제는 저장하는 방법을 보여줍니다. .파일을 서버에 저장하지 않고 파일 입력에서 파일을 Excel로 읽는 방법

내가해야할 일은 웹 페이지 및 FileReader에서 Excel 파일을 받고 엑셀 시트의 첫 번째 행에서 열 이름이 보존 된 데이터 테이블에 저장하는 것입니다.

아래의 코드는 필자가 필요로하는 것이지만 파일을 저장소에 먼저 저장하지 않고 데이터 테이블로 읽는 방법을 보여주지는 않습니다.

Excel 파일을 저장하고이 정보를 처리 한 후 모든 열 이름이 올바른지, 각 행의 데이터가 올바른지 확인해야합니다. 그러면이 정보를 SQL에 저장하는 프로세스가 시작됩니다 데이터 베이스.

열 이름을 유지하면서 Excel 파일을 데이터 테이블에 스트림으로 저장하려면 어떻게해야합니까?

** 테이블 이름이 중요하지 않음을 유의하십시오. Excel 책의 첫 번째 시트 만 처리하므로 각 행의 열 이름과 데이터 형식이 가장 중요합니다.

코드에서 인용했다 : 당신이 좋아하는 뭔가를 사용하여이 EPPlus을 할 수 http://www.aspsnippets.com/Articles/Read-and-Import-Excel-File-into-DataSet-or-DataTable-using-C-and-VBNet-in-ASPNet.aspx

using System; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
using System.Data; 
using System.Data.OleDb; 
using System.IO; 
using System.Configuration; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
    protected void btnUpload_Click(object sender, EventArgs e) 
    { 
     if (FileUpload1.HasFile) 
     { 
      string FileName = Path.GetFileName(FileUpload1.PostedFile.FileName); 
      string Extension = Path.GetExtension(FileUpload1.PostedFile.FileName); 
      string FolderPath = ConfigurationManager.AppSettings["FolderPath"]; 

      string FilePath = Server.MapPath(FolderPath + FileName); 
      FileUpload1.SaveAs(FilePath); 
      Import_To_Grid(FilePath, Extension, rbHDR.SelectedItem.Text); 
     } 
    } 
    private void Import_To_Grid(string FilePath, string Extension, string isHDR) 
    { 
     string conStr=""; 
     switch (Extension) 
     { 
      case ".xls": //Excel 97-03 
       conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString; 
       break; 
      case ".xlsx": //Excel 07 
       conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"].ConnectionString; 
       break; 
     } 
     conStr = String.Format(conStr, FilePath, isHDR); 
     OleDbConnection connExcel = new OleDbConnection(conStr); 
     OleDbCommand cmdExcel = new OleDbCommand(); 
     OleDbDataAdapter oda = new OleDbDataAdapter(); 
     DataTable dt = new DataTable(); 
     cmdExcel.Connection = connExcel; 

     //Get the name of First Sheet 
     connExcel.Open(); 
     DataTable dtExcelSchema; 
     dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
     string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString(); 
     connExcel.Close(); 

     //Read Data from First Sheet 
     connExcel.Open(); 
     cmdExcel.CommandText = "SELECT * From [" + SheetName + "]"; 
     oda.SelectCommand = cmdExcel; 
     oda.Fill(dt); 
     connExcel.Close(); 

     //Bind Data to GridView 
     GridView1.Caption = Path.GetFileName(FilePath); 
     GridView1.DataSource = dt; 
     GridView1.DataBind(); 
    } 

답변

1

다음

protected void btnUpload_Click(object sender, EventArgs e) 
{ 
    if (FileUpload1.HasFile) 
    { 
     DataTable dataTable = new DataTable(); 
     using (MemoryStream mStream = new MemoryStream(fileContents)) 
     { 
      using (var excelPackage = new ExcelPackage(mStream)) 
      { 
       ExcelWorksheet firstSheet = excelPackage.Workbook.Worksheets.First(); 
       var endAddress = firstSheet.Dimension.End; 
       dataTable.TableName = firstSheet.Name; 
       ExcelRange headerRange = firstSheet.Cells[1, 1, 1,endAddress.Column ]; 

       //Add columns using headers 
       foreach (var cell in headerRange) 
       { 
        dataTable.Columns.Add(cell.Value.ToString()); //You can hardcode whatever type you need to here 
       } 

       //Add Data: 
       for (int rowIdx = 2; rowIdx <= endAddress.Row; rowIdx++) 
       { 
        DataRow dataRow = dataTable.NewRow(); 
        for (int colIdx = 1; colIdx <= endAddress.Column; colIdx++) 
        { 
         dataRow[colIdx - 1] = firstSheet.Cells[rowIdx, colIdx].Value; 
        } 
        dataTable.Rows.Add(dataRow); 
       } 
      } 
     } 
     //Now Do whatever you want with your DataTable: 
     GridView1.DataSource = dataTable; 
     GridView1.DataBind(); 
    } 
} 

유일한 문제는 당신이에서 스키마의 모든 종류를 읽고되지 않습니다됩니다 가져온 파일이므로 어떤 유형도 얻지 못합니다 (위의 예는 일반 행 object 유형으로 채워진 각 행으로 끝납니다).

강력한 형식의 데이터 테이블이 필요하고 사전에 DataTable에 필요한 열 유형을 알고 있으면 열을 만드는 행을 전환 할 수 있습니다. 예를 들어 :

dataTable.Columns.Add(cell.Value.ToString(),typeof(int)); 

은 사전에 열의 유형과 여전히 를 모르는 경우 당신이로 통과 할 type 결정하는 셀의 Style.Numberformat 속성을 사용하여 뭔가를 kludge 수도 있겠죠 다음 강력한 형식의 테이블이 필요 열 생성자.

관련 문제