这是我正在使用的代码,但它会读取整个Excel工作表。如何只从一个特定的列或行读取数据?
Application xlApp;
Workbook xlWorkBook;
Worksheet xlWorkSheet;
Range range;
string str;
int rCnt = 0;
int cCnt = 0;
xlApp = new Application();
xlWorkBook = xlApp.Workbooks.Open("c:\\telltales.xlsx");
xlWorkSheet = (Worksheet)xlWorkBook.Worksheets.get_Item(1);
range = xlWorkSheet.UsedRange;
for (rCnt = 1; rCnt <= range.Rows.Count; rCnt++)
{
for (cCnt = 1; cCnt <= range.Columns.Count; cCnt++)
{
str = (string)(range.Cells[rCnt, cCnt] as Range).Value2;
Console.WriteLine(str);
}
}
答案 0 :(得分:1)
如果只是读取一个细胞或一系列细胞,请考虑使用OleDb数据提供者,如下所示。使用OleDb时,无需担心清理对象,如果程序意外终止,办公自动化对象会留在内存中,而不像OleDb。下面我还提供了构建连接字符串的正确方法。从OneDrive免费download the project。
using System;
using System.Data;
using System.Data.OleDb;
namespace ExcelReadRangeSimple
{
internal class Program
{
/// <summary>
/// This functiuon is an example of how you can setup a connection for an
/// Excel file based on the extension.
/// </summary>
/// <param name="FileName"></param>
/// <param name="Header"></param>
/// <returns></returns>
/// <remarks>
/// There are no guaranty that the settings below will be correct for
/// your Excel file. Things to tweak if it does not work
///
/// - IMEX
/// - HDR
///
/// SeeAlso for IMEX
/// http://www.codeproject.com/Articles/37055/Working-with-MS-Excel-xls-xlsx-Using-MDAC-and-Oled
/// </remarks>
static public string ConnectionString(string FileName, string Header)
{
OleDbConnectionStringBuilder Builder = new OleDbConnectionStringBuilder();
if (System.IO.Path.GetExtension(FileName).ToUpper() == ".XLS")
{
Builder.Provider = "Microsoft.Jet.OLEDB.4.0";
Builder.Add("Extended Properties", string.Format("Excel 8.0;IMEX=1;HDR={0};", Header));
}
else
{
Builder.Provider = "Microsoft.ACE.OLEDB.12.0";
Builder.Add("Extended Properties", string.Format("Excel 12.0;IMEX=1;HDR={0};", Header));
}
Builder.DataSource = FileName;
return Builder.ConnectionString;
}
/// <summary>
///
/// </summary>
/// <param name="FileName">Full path and file name to read</param>
/// <param name="SheetName">Name of sheet to read, do not append $</param>
/// <param name="StartCell">Cell to start range i.e. A1</param>
/// <param name="EndCell">Cell to end range i.e. D30</param>
static private void DemoReadData(string FileName, string SheetName, string StartCell, string EndCell)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
DataTable dt = new DataTable();
using (OleDbConnection cn = new OleDbConnection { ConnectionString = ConnectionString(FileName, "No") })
{
cn.Open();
string SelectStatement = string.Format("SELECT F1 As Company, F2 As Contact FROM [{0}${1}:{2}]", SheetName, StartCell, EndCell);
using (OleDbCommand cmd = new OleDbCommand { CommandText = SelectStatement, Connection = cn })
{
Console.WriteLine();
Console.WriteLine("Connection string is");
Console.WriteLine(cn.ConnectionString);
Console.WriteLine();
Console.WriteLine();
OleDbDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
while (dr.Read())
{
Console.WriteLine(" {0,-25} {1}", dr.GetString(1), dr.GetString(0));
}
}
else
{
Console.WriteLine("No rows!!!");
}
}
}
}
private static void Main(string[] args)
{
string FileName = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "WS1.xlsx");
DemoReadData(FileName, "Sheet4", "C7", "D16");
Console.ReadLine();
}
}
}
现在,如果您真的想要使用办公自动化,请考虑遵循下面介绍的模型,该模型对于如何使用和销毁对象非常细致,以确保正确清理所有使用的对象。很多时候,开发人员不会花时间去做这件事,应该这样做。
public void OpenExcel(string FileName, string SheetName, string CellAddress, string CellValue)
{
List<string> SheetNames = new List<string>();
bool Proceed = false;
Excel.Application xlApp = null;
Excel.Workbooks xlWorkBooks = null;
Excel.Workbook xlWorkBook = null;
Excel.Worksheet xlWorkSheet = null;
Excel.Sheets xlWorkSheets = null;
xlApp = new Excel.Application();
xlApp.DisplayAlerts = false;
xlWorkBooks = xlApp.Workbooks;
xlWorkBook = xlWorkBooks.Open(FileName);
xlApp.Visible = false;
xlWorkSheets = xlWorkBook.Sheets;
for (int x = 1; x <= xlWorkSheets.Count; x++)
{
xlWorkSheet = (Excel.Worksheet)xlWorkSheets[x];
SheetNames.Add(xlWorkSheet.Name);
if (xlWorkSheet.Name == SheetName)
{
Proceed = true;
Excel.Range xlRange1 = null;
xlRange1 = xlWorkSheet.Range[CellAddress];
xlRange1.Value = CellValue;
string value = xlRange1.Value;
Console.WriteLine(value);
Marshal.FinalReleaseComObject(xlRange1);
xlRange1 = null;
xlWorkSheet.SaveAs(FileName);
break;
}
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlWorkSheet);
xlWorkSheet = null;
}
xlWorkBook.Close();
xlApp.Quit();
ReleaseComObject(xlWorkSheets);
ReleaseComObject(xlWorkSheet);
ReleaseComObject(xlWorkBook);
ReleaseComObject(xlWorkBooks);
ReleaseComObject(xlApp);
if (Proceed)
{
MessageBox.Show("Found sheet, do your work here.");
}
else
{
MessageBox.Show("Sheet not located");
}
MessageBox.Show("Sheets available \n" + String.Join("\n", SheetNames.ToArray()));
}
private void ReleaseComObject(object obj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj = null;
}
catch (Exception)
{
obj = null;
}
}
public string GetCellValue(string FileName, string SheetName, string CellAddress)
{
string CellValue = "";
Excel.Application xlApp = null;
Excel.Workbooks xlWorkBooks = null;
Excel.Workbook xlWorkBook = null;
Excel.Worksheet xlWorkSheet = null;
Excel.Sheets xlWorkSheets = null;
xlApp = new Excel.Application();
xlApp.DisplayAlerts = false;
xlWorkBooks = xlApp.Workbooks;
xlWorkBook = xlWorkBooks.Open(FileName);
xlApp.Visible = false;
xlWorkSheets = xlWorkBook.Sheets;
for (int x = 1; x <= xlWorkSheets.Count; x++)
{
xlWorkSheet = (Excel.Worksheet)xlWorkSheets[x];
if (xlWorkSheet.Name == SheetName)
{
Excel.Range xlRange1 = null;
xlRange1 = xlWorkSheet.Range[CellAddress];
CellValue = xlRange1.Value;
Marshal.FinalReleaseComObject(xlRange1);
xlRange1 = null;
xlWorkSheet.SaveAs(FileName);
break;
}
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlWorkSheet);
xlWorkSheet = null;
}
xlWorkBook.Close();
xlApp.Quit();
ReleaseComObject(xlWorkSheets);
ReleaseComObject(xlWorkSheet);
ReleaseComObject(xlWorkBook);
ReleaseComObject(xlWorkBooks);
ReleaseComObject(xlApp);
return CellValue;
}