我需要在不使用第三方库的情况下读取.xlsx文件。
我这样做:
private void Upload(string filename)
{
FileStream stream = File.Open(filename, FileMode.Open, FileAccess.Read);
// Reading from a OpenXml Excel file (2007 format; *.xlsx)
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//DataSet - The result of each spreadsheet will be created in the result.Tables
excelReader.IsFirstRowAsColumnNames = false;
DataSet result = excelReader.AsDataSet();
//5. Data Reader methods
string value = GetValue(0, 0, excelReader);
//6. Free resources (IExcelDataReader is IDisposable)
excelReader.Close();
}
我不知道如何阅读正确的单元格。问题不在于列位置(我可以使用,但行位置。
public string GetValue(int row, int col, IExcelDataReader excelReader)
{
string s;
// ??? how to positionate on the right row?
s = excelReader(column_value);
return s;
}
答案 0 :(得分:1)
我创建并使用以下类来阅读.xlsx
或.xls
文件中的第一张表:
/// <summary>
/// Reads a table from a spreadsheet.
/// </summary>
public sealed class XlsxReader
{
/// <summary>
/// Loads an xlsx file from a filepath into the datatable.
/// </summary>
/// <param name="filePath"></param>
/// <returns>Returns a DataTable with data from the first sheet.</returns>
public static DataTable FromXLSX(string filePath)
{
try
{
// Create the new datatable.
DataTable dtexcel = new DataTable();
// Define the SQL for querying the Excel spreadsheet.
bool hasHeaders = true;
string HDR = hasHeaders ? "Yes" : "No";
string strConn;
// If it is a xlsx file
if (filePath.Substring(filePath.LastIndexOf('.')).ToLower() == ".xlsx")
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=1;\"";
else
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=\"Excel 8.0;HDR=" + HDR + ";IMEX=1;\"";
// Create connection
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
// Get scheme
DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
DataRow schemaRow = schemaTable.Rows[0];
// Get sheet name
string sheet = schemaRow["TABLE_NAME"].ToString();
if (!sheet.EndsWith("_"))
{
// Query data from the sheet
string query = "SELECT * FROM [" + sheet + "]";
OleDbDataAdapter daexcel = new OleDbDataAdapter(query, conn);
dtexcel.Locale = CultureInfo.CurrentCulture;
// Fill the datatable.
daexcel.Fill(dtexcel);
}
// Close connection.
conn.Close();
// Set the datatable.
return dtexcel;
}
catch { throw; }
}
}
它将工作表作为DataTable
返回。