Excel DataReader를 사용하여 특정 셀에서 시작하는 Excel 데이터 읽기
C#에 있는 Excel 워크북의 데이터를 읽는데 사용하고 있습니다.
그러나 내 Excel 시트의 구조는 읽을 데이터가 반드시 필요한 것은 아닌 특정 셀에서 시작할 수 있도록 되어 있습니다.A1
.
누구나 할 수 있습니까? 이것이 어떻게 달성될 수 있는지에 대한 방법을 제안해 주십시오.ExcelDataReader
?
사용 중인 경우ExcelDataReader 3+
당신은 어떤 방법도 없다는 것을 알게 될 것입니다.AsDataSet()
당신의 독자 객체를 위해, 당신은 또한 다른 패키지를 설치해야 합니다, 그리고 당신은 사용할 수 있습니다.AsDataSet()
방법.
또한 다음을 위한 속성이 없습니다.IsFirstRowAsColumnNames
대신 당신은 그것을 안에 둘 필요가 있습니다.ExcelDataSetConfiguration
.
예:
using (var stream = File.Open(originalFileName, FileMode.Open, FileAccess.Read))
{
IExcelDataReader reader;
// Create Reader - old until 3.4+
////var file = new FileInfo(originalFileName);
////if (file.Extension.Equals(".xls"))
//// reader = ExcelDataReader.ExcelReaderFactory.CreateBinaryReader(stream);
////else if (file.Extension.Equals(".xlsx"))
//// reader = ExcelDataReader.ExcelReaderFactory.CreateOpenXmlReader(stream);
////else
//// throw new Exception("Invalid FileName");
// Or in 3.4+ you can only call this:
reader = ExcelDataReader.ExcelReaderFactory.CreateReader(stream)
//// reader.IsFirstRowAsColumnNames
var conf = new ExcelDataSetConfiguration
{
ConfigureDataTable = _ => new ExcelDataTableConfiguration
{
UseHeaderRow = true
}
};
var dataSet = reader.AsDataSet(conf);
// Now you can get data from each sheet by its index or its "name"
var dataTable = dataSet.Tables[0];
//...
}
다음과 같이 셀 참조의 행 번호와 열 번호를 찾을 수 있습니다.
var cellStr = "AB2"; // var cellStr = "A1";
var match = Regex.Match(cellStr, @"(?<col>[A-Z]+)(?<row>\d+)");
var colStr = match.Groups["col"].ToString();
var col = colStr.Select((t, i) => (colStr[i] - 64) * Math.Pow(26, colStr.Length - i - 1)).Sum();
var row = int.Parse(match.Groups["row"].ToString());
이제 루프를 사용하여 다음과 같이 셀에서 데이터를 읽을 수 있습니다.
for (var i = row; i < dataTable.Rows.Count; i++)
{
for (var j = col; j < dataTable.Columns.Count; j++)
{
var data = dataTable.Rows[i][j];
}
}
업데이트:
다음 구성을 사용하여 읽기 시간에 Excel 시트의 행과 열을 필터링할 수 있습니다.
var i = 0;
var conf = new ExcelDataSetConfiguration
{
UseColumnDataType = true,
ConfigureDataTable = _ => new ExcelDataTableConfiguration
{
FilterRow = rowReader => fromRow <= ++i - 1,
FilterColumn = (rowReader, colIndex) => fromCol <= colIndex,
UseHeaderRow = true
}
};
좀 더 명확하게 말씀드리자면, 저는 처음부터 시작하겠습니다.
저는 https://github.com/ExcelDataReader/ExcelDataReader, 에 있는 샘플 코드에 의존할 것이지만 불편함을 피하기 위해 약간의 수정을 할 것입니다.
다음 코드는 xls 또는 xlsx 파일 형식을 탐지합니다.
FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader;
//1. Reading Excel file
if (Path.GetExtension(filePath).ToUpper() == ".XLS")
{
//1.1 Reading from a binary Excel file ('97-2003 format; *.xls)
excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
}
else
{
//1.2 Reading from a OpenXml Excel file (2007 format; *.xlsx)
excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
}
//2. DataSet - The result of each spreadsheet will be created in the result.Tables
DataSet result = excelReader.AsDataSet();
//3. DataSet - Create column names from first row
excelReader.IsFirstRowAsColumnNames = false;
이제 파일 내용에 보다 편리한 방식으로 액세스할 수 있습니다.저는 이것을 위해 DataTable을 사용합니다.다음은 특정 셀에 액세스하여 콘솔에서 해당 값을 인쇄하는 예입니다.
DataTable dt = result.Tables[0];
Console.WriteLine(dt.Rows[rowPosition][columnPosition]);
데이터 테이블을 수행하지 않으려면 다음과 같이 수행할 수 있습니다.
Console.WriteLine(result.Tables[0].Rows[rowPosition][columnPosition]);
표의 한계를 넘어서 읽지 않는 것이 중요합니다. 이 경우 다음과 같이 행과 열의 수를 확인할 수 있습니다.
Console.WriteLine(result.Tables[0].Rows.Count);
Console.WriteLine(result.Tables[0].Columns.Count);
마지막으로, 완료되면 판독기를 닫고 리소스를 확보해야 합니다.
//5. Free resources (IExcelDataReader is IDisposable)
excelReader.Close();
도움이 되길 바랍니다.
(질문이 오래된 것은 이해하지만, 이 라이브러리의 특정 구현에 대한 자료가 거의 없기 때문에 지식 기반을 향상시키기 위해 이러한 기여를 합니다.)
Excel DataReader v3.6.0 이상인 경우.저는 Rows를 반복하기 위해 약간 애를 썼습니다.위의 코드를 조금 더 보여드리겠습니다.적어도 소수에게 도움이 되기를 바랍니다.
using (var stream = System.IO.File.Open(copyPath, FileMode.Open, FileAccess.Read))
{
IExcelDataReader excelDataReader = ExcelDataReader.ExcelReaderFactory.CreateReader(stream);
var conf = new ExcelDataSetConfiguration()
{
ConfigureDataTable = a => new ExcelDataTableConfiguration
{
UseHeaderRow = true
}
};
DataSet dataSet = excelDataReader.AsDataSet(conf);
//DataTable dataTable = dataSet.Tables["Sheet1"];
DataRowCollection row = dataSet.Tables["Sheet1"].Rows;
//DataColumnCollection col = dataSet.Tables["Sheet1"].Columns;
List<object> rowDataList = null;
List<object> allRowsList = new List<object>();
foreach (DataRow item in row)
{
rowDataList = item.ItemArray.ToList(); //list of each rows
allRowsList.Add(rowDataList); //adding the above list of each row to another list
}
}
한 가지 방법:
FileStream stream = File.Open(@"c:\working\test.xls", FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
excelReader.IsFirstRowAsColumnNames = true;
DataSet result = excelReader.AsDataSet();
그result.Tables
시트를 포함하고 있습니다.result.tables[0].Rows
셀 행을 포함합니다.
특정 열과 행을 읽는 데 유용하다는 것을 알게 되었습니다.
FileStream stream = File.Open(@"C:\Users\Desktop\ExcelDataReader.xlsx", FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
DataSet result = excelReader.AsDataSet();
excelReader.IsFirstRowAsColumnNames = true;
DataTable dt = result.Tables[0];
string text = dt.Rows[1][0].ToString();
Excel Reader Factory 3.1 이상을 사용하면 매우 간단합니다.
using (var openFileDialog1 = new OpenFileDialog { Filter = "Excel Workbook|*.xls;*.xlsx;*.xlsm", ValidateNames = true })
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
var fs = File.Open(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
var reader = ExcelReaderFactory.CreateBinaryReader(fs);
var dataSet = reader.AsDataSet(new ExcelDataSetConfiguration
{
ConfigureDataTable = _ => new ExcelDataTableConfiguration
{
UseHeaderRow = true // Use first row is ColumnName here :D
}
});
if (dataSet.Tables.Count > 0)
{
var dtData = dataSet.Tables[0];
// Do Something
}
}
}
public static DataTable ConvertExcelToDataTable(string filePath, bool isXlsx = false)
{
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
//open file and returns as Stream
using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read))
{
using (var reader = ExcelReaderFactory.CreateReader(stream))
{
var conf = new ExcelDataSetConfiguration
{
ConfigureDataTable = _ => new ExcelDataTableConfiguration
{
UseHeaderRow = true
}
};
var dataSet = reader.AsDataSet(conf);
// Now you can get data from each sheet by its index or its "name"
var dataTable = dataSet.Tables[0];
Console.WriteLine("Total no of rows " + dataTable.Rows.Count);
Console.WriteLine("Total no of Columns " + dataTable.Columns.Count);
return dataTable;
}
}
}
를 사용할 수 있습니다.제가 생각하는 것과 같은 일을 하는 NET 라이브러리가 더 간단합니다.
string ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; data source={path of your excel file}; Extended Properties=Excel 12.0;";
OleDbConnection objConn = null;
System.Data.DataTable dt = null;
//Create connection object by using the preceding connection string.
objConn = new OleDbConnection(connString);
objConn.Open();
//Get the data table containg the schema guid.
dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
string sql = string.Format("select * from [{0}$]", sheetName);
var adapter = new System.Data.OleDb.OleDbDataAdapter(sql, ConnectionString);
var ds = new System.Data.DataSet();
string tableName = sheetName;
adapter.Fill(ds, tableName);
System.Data.DataTable data = ds.Tables[tableName];
데이터 테이블에 데이터를 저장한 후에는 데이터 테이블 클래스에서 일반적으로 수행하는 것처럼 데이터 테이블에 액세스할 수 있습니다.
언급URL : https://stackoverflow.com/questions/27634477/using-exceldatareader-to-read-excel-data-starting-from-a-particular-cell
'programing' 카테고리의 다른 글
jQuery를 사용하지 않고 rails-ujs Rails.ajax POST 호출로 JSON 데이터를 어떻게 전송합니까? (0) | 2023.07.26 |
---|---|
Eclipse Juno에 Marketplace 플러그인 (0) | 2023.05.07 |
워크북_워크북을 열 때 열기 하위 항목이 실행되지 않습니까? (0) | 2023.05.07 |
웹 개발자용 Windows Azure vs Amazon EC2 (0) | 2023.05.07 |
Postgre를 변경하려면 어떻게 해야 합니다.SQL 테이블 및 열을 고유하게 만드시겠습니까? (0) | 2023.05.07 |