我在这里希望有人可以点我在正确的方向 - 我试图创建一个相当强大的实用程序来读取一个Excel工作表中的数据(可能的.xls或.xlsx)到一个DataTable尽快和瘦削如可能.
我在VB中想出了这个例程(尽管我对C#答案很满意):
Public Shared Function ReadExcelIntoDataTable(ByVal FileName As String, ByVal SheetName As String) As DataTable
Dim RetVal As New DataTable
Dim strConnString As String
strConnString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & FileName & ";"
Dim strSQL As String
strSQL = "SELECT * FROM [" & SheetName & "$]"
Dim y As New Odbc.OdbcDataAdapter(strSQL, strConnString)
y.Fill(RetVal)
Return RetVal
End Function
Run Code Online (Sandbox Code Playgroud)
我想知道这是否是最好的方法,或者是否有更好/更有效的方式(或者只是更智能的方式 - 也许Linq /本地.Net提供商)来代替使用?
另外,只是一个快速而愚蠢的附加问题 - 我是否需要包含诸如y.Dispose()和/ y = Nothing或将要处理的代码,因为变量应该在例程结束时死掉,对吧?
谢谢!!
任务
从数据导入excel到DataTable
问题
将跳过不包含任何数据的单元格,并将具有该行中数据的下一个单元格用作空列的值.例如
A1是空的A2有一个值Tom,然后在导入数据A1得到的值A2和A2保持空白
为了说清楚,我在下面提供一些屏幕截图
这是excel数据
码
public class ImportExcelOpenXml
{
public static DataTable Fill_dataTable(string fileName)
{
DataTable dt = new DataTable();
using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(fileName, false))
{
WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
string relationshipId = sheets.First().Id.Value;
WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
Worksheet workSheet = worksheetPart.Worksheet;
SheetData sheetData = workSheet.GetFirstChild<SheetData>();
IEnumerable<Row> rows = sheetData.Descendants<Row>();
foreach (Cell cell in rows.ElementAt(0))
{
dt.Columns.Add(GetCellValue(spreadSheetDocument, …Run Code Online (Sandbox Code Playgroud) 我使用Epplus从流中读取xlsx文件.
它有一个错误,它无法读取我的工作簿中的一些列.如何在没有epplus的情况下将xlsx文件从流读取到数据表?
我的旧代码:
public static DataSet ReadExcelFile(Stream stream)
{
try
{
//2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
IExcelDataReader excelReader =
ExcelReaderFactory.CreateOpenXmlReader(stream);
//...
DataSet result = excelReader.AsDataSet();
return result;
}
catch (Exception x)
{
throw x;
}
}
Run Code Online (Sandbox Code Playgroud)
我没有报告它,但我尝试了很多组合.如果工作表中有空列,epplus阅读器无法正确读取列值.
我在项目中添加了EPPlus和OfficeOpenXml的使用.但是,当我运行我的项目时,我收到此错误并发出警告:
警告 :
The referenced assembly "EPPlus" could not be resolved because it has a dependency on "System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which is not in the currently targeted framework ".NETFramework,Version=v4.0,Profile=Client". Please remove references to assemblies not in the targeted framework or consider retargeting your project.
Run Code Online (Sandbox Code Playgroud)
错误:
The type or namespace name 'OfficeOpenXml' could not be found (are you missing a using directive or an assembly reference?)
The type or namespace name 'ExcelPackage' could not be found (are you missing a …Run Code Online (Sandbox Code Playgroud)