但是如果不存實體檔案,存到一個暫存空間 ( MemoryStream ),再將資料轉換成 DataTable 或者是 IDataReader ,最後資料讀取出來或傳入 GridView 使用。
1.
首先先下載 ClosedXML:http://closedxml.codeplex.com/releases/view/110822 並引入參考。2.
撰寫一個類別使用 ClosedXML 寫常用的方法到時方便使用。 ( 以下是參考程式碼,可依照狀況不同調整 )using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.IO;
using ClosedXML.Excel;
namespace FileHanding
{
//ClosedXML Documentation: http://closedxml.codeplex.com/documentation
public class FileHanding
{
public MemoryStream TransferDataTableToExcel(DataTable dt)
{
var wb = new XLWorkbook();
wb.Worksheets.Add(dt);
MemoryStream ms = new MemoryStream();
wb.SaveAs(ms);
return ms;
}
public DataTable TransferExcelToDataTable(byte[] file)
{
Stream fileStream = new MemoryStream(file);
var workbook = new XLWorkbook(fileStream);
var xlWorksheet = workbook.Worksheet(1);
return TransferExcelToDataTable(xlWorksheet);
}
public DataTable TransferExcelToDataTable(byte[] file, string sheetName)
{
Stream fileStream = new MemoryStream(file);
var workbook = new XLWorkbook(fileStream);
var xlWorksheet = workbook.Worksheet(sheetName);
return TransferExcelToDataTable(xlWorksheet);
}
public DataTable TransferExcelToDataTable(string filePath)
{
var workbook = new XLWorkbook(filePath);
var xlWorksheet = workbook.Worksheet(1);
return TransferExcelToDataTable(xlWorksheet);
}
public DataTable TransferExcelToDataTable(string filePath, string sheetName)
{
var workbook = new XLWorkbook(filePath);
var xlWorksheet = workbook.Worksheet(sheetName);
return TransferExcelToDataTable(xlWorksheet);
}
private DataTable TransferExcelToDataTable(IXLWorksheet xlWorksheet)
{
var datatable = new DataTable();
var range = xlWorksheet.Range(xlWorksheet.FirstCellUsed(), xlWorksheet.LastCellUsed());
int col = range.ColumnCount();
int row = range.RowCount();
// add columns hedars
datatable.Clear();
for (int i = 1; i <= col; i++)
{
IXLCell column = xlWorksheet.Cell(1, i);
datatable.Columns.Add(column.Value.ToString());
}
// add rows data
int firstHeadRow = 0;
foreach (var item in range.Rows())
{
if (firstHeadRow != 0)
{
var array = new object[col];
for (int y = 1; y <= col; y++)
{
array[y - 1] = item.Cell(y).Value;
}
datatable.Rows.Add(array);
}
firstHeadRow++;
}
return datatable;
}
public IDataReader TransferExcelToIDataReader(byte[] file)
{
Stream fileStream = new MemoryStream(file);
var workbook = new XLWorkbook(fileStream);
var xlWorksheet = workbook.Worksheet(1);
return TransferExcelToIDataReader(xlWorksheet);
}
public IDataReader TransferExcelToIDataReader(byte[] file, string sheetName)
{
Stream fileStream = new MemoryStream(file);
var workbook = new XLWorkbook(fileStream);
var xlWorksheet = workbook.Worksheet(sheetName);
return TransferExcelToIDataReader(xlWorksheet);
}
public IDataReader TransferExcelToIDataReader(string filePath)
{
var workbook = new XLWorkbook(filePath);
var xlWorksheet = workbook.Worksheet(1);
return TransferExcelToIDataReader(xlWorksheet);
}
public IDataReader TransferExcelToIDataReader(string filePath, string sheetName)
{
var workbook = new XLWorkbook(filePath);
var xlWorksheet = workbook.Worksheet(sheetName);
return TransferExcelToIDataReader(xlWorksheet);
}
private IDataReader TransferExcelToIDataReader(IXLWorksheet xlWorksheet)
{
var datatable = new DataTable();
var range = xlWorksheet.Range(xlWorksheet.FirstCellUsed(), xlWorksheet.LastCellUsed());
int col = range.ColumnCount();
int row = range.RowCount();
// add columns hedars
datatable.Clear();
for (int i = 1; i <= col; i++)
{
IXLCell column = xlWorksheet.Cell(1, i);
datatable.Columns.Add(column.Value.ToString());
}
// add rows data
int firstHeadRow = 0;
foreach (var item in range.Rows())
{
if (firstHeadRow != 0)
{
var array = new object[col];
for (int y = 1; y <= col; y++)
{
array[y - 1] = item.Cell(y).Value;
}
datatable.Rows.Add(array);
}
firstHeadRow++;
}
return datatable.CreateDataReader();
}
public MemoryStream TransferDataTableToCsv(DataTable dt)
{
MemoryStream ms = new MemoryStream();
StreamWriter result = new StreamWriter(ms, Encoding.UTF8);
//Header
for (int i = 0; i < dt.Columns.Count; i++)
{
result.Write(dt.Columns[i].ColumnName);
result.Write(i == dt.Columns.Count - 1 ? "\n" : ",");
}
//Content
foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
result.Write(row[i].ToString());
result.Write(i == dt.Columns.Count - 1 ? "\n" : ",");
}
}
return ms;
}
public DataTable TransferCsvToDataTable(string strFilePath)
{
string strFileName = Path.GetFileName(strFilePath);
string strFileDirectory = Path.GetDirectoryName(strFilePath);
string strConn = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}\;Extended Properties='Text;HDR=Yes;'", strFileDirectory);
string strSQL = string.Format("SELECT * FROM [{0}]", strFileName);
OleDbDataAdapter adapter = new OleDbDataAdapter(strSQL, strConn);
DataTable dt = new DataTable();
adapter.Fill(dt);
return dt;
}
}
}
3.
介面上,只需要用一般的 input 加上 runat="server" 即可,利用 Postback 將檔案讀取。以下是介面圖:再看看程式碼快照:
4.
在上傳檔案時,將檔案轉換成 byte[],並傳入已經寫好的類別 ( FileHanding ) 方法進行轉換,以下為參考程式碼:using FileHanding;
...
...
...
...
...
...
protected void btnImport_Click(object sender, EventArgs e)
{
if (IsPostBack)
{
if (file.PostedFile != null)
{
FileHanding fh = new FileHanding();;
string strErrorMessage = string.Empty;
var postedFile = file.PostedFile;
int iDataLength = postedFile.ContentLength;
byte[] bData = new byte[iDataLength];
bool bIsVerify = true;
postedFile.InputStream.Read(bData, 0, iDataLength);
if (txtSheetName.Text.Trim() == string.Empty)
dt = fh.TransferExcelToDataTable(bData);
else
dt = fh.TransferExcelToDataTable(bData, txtSheetName.Text);
/* 以下再做資料處理 */
}
}
}


沒有留言 :
張貼留言