如何通过 oledb reader 或 excel 库、excel 数据 reader 或 NPOI 等(Interop 除外)检查单元格是否包含 Excel 中的公式?
How to check a Cell contains formula or not in Excel through oledb reader or excel library, excel datareader or NPOI etc (Except Interop)?
如何通过 oledb reader 在 Excel 中检查单元格是否包含公式?
System.Data.OleDb.OleDbConnection conn2 = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " + strFileName + "; Extended Properties = \"Excel 8.0;HDR=NO;IMEX=1\";");
conn2.Open();
string strQuery2 = "SELECT * FROM [" + Table + "]";
System.Data.OleDb.OleDbDataAdapter adapter2 = new System.Data.OleDb.OleDbDataAdapter(strQuery2, conn2);
System.Data.DataTable DT2 = new System.Data.DataTable();
adapter2.Fill(DT2);
您可以探索这个:Range.HasFormula
在 com-interop
下。
我还注意到有一个 post 可以即兴创作 来满足您的需求。
这是一个框架 - 不是确切的语法。
Excel.Application excelApp = new Excel.Application();
Excel.Workbook workBook = excelApp.Workbooks.Open(filePath);
Excel.WorkSheet WS = workBooks.WorkSheets("Sheet1");
Range rangeData = WS.Range["A1:C3"];
foreach (Excel.Range c in rangeData.Cells)
{
if (c.HasFormula)
{
MessageBox.Show(Convert.ToString(c.Value));
}
}
不确定如何使用 OLEDB
实现此目的,因为您的查询似乎只是 grab 单元格数据(文本、数字、无公式)到查询中.
如果您必须使用 OLEDB
,this post 可能会有所帮助。
如果您仍然需要帮助,请随时发表评论。
我得到了解决方案,但仅限于互操作服务!!
public bool IsFormulaExistInExcel(string excelpath)
{
bool IsFormulaExist = false;
try
{
Microsoft.Office.Interop.Excel.Application excelApp = null;
Microsoft.Office.Interop.Excel.Workbooks workBooks = null;
Microsoft.Office.Interop.Excel.Workbook workBook = null;
Microsoft.Office.Interop.Excel.Worksheet workSheet;
excelApp = new Microsoft.Office.Interop.Excel.Application();
workBooks = excelApp.Workbooks;
workBook = workBooks.Open(excelpath, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
workSheet = workBook.Worksheets.get_Item(1);
Microsoft.Office.Interop.Excel.Range rng = workSheet.UsedRange;
dynamic FormulaExist = rng.HasFormula;
Type unknown = FormulaExist.GetType();
if (unknown.Name == "DBNull")
IsFormulaExist = true;
else if (unknown.Name == "Boolean")
{
if (FormulaExist == false)
IsFormulaExist = false;
else if (FormulaExist == true)
IsFormulaExist = true;
}
}
catch (Exception E)
{
}
return IsFormulaExist;
}
如果您的 excel 文件是 .xlsx,那么,由于 .xlsx 实际上是一个 zip 存档,您可以在其中阅读 xl\calcChain.xml。此文件包含如下条目:
<c r="G3" i="1" l="1"/><c r="A3" i="1" l="1"/>
在此示例中,单元格 G3 和 A3 中有公式。
所以你可以这样做:
// Add references for
// System.IO.Compression
// System.IO.Compression.FileSystem
private static List<string> GetCellsWithFormulaInSheet(string xlsxFileName, int sheetNumber)
{
using (var zip = System.IO.Compression.ZipFile.OpenRead(xlsxFileName))
{
var list = new List<string>();
var entry = zip.Entries.FirstOrDefault(e => e.FullName == "xl/calcChain.xml");
if (entry == null)
return list;
var xdoc = XDocument.Load(entry.Open());
XNamespace ns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
return xdoc.Root.Elements(ns + "c")
.Select(x => new { Cell = x.Attribute("r").Value, Sheet = int.Parse(x.Attribute("i").Value) })
.Where(x => x.Sheet == sheetNumber)
.Select(x => x.Cell)
.ToList();
}
}
然后像这样使用这个方法:
var cellsWithFormula = GetCellsWithFormulaInSheet(@"c:\Book.xlsx", 1);
bool hasFormulaInSheet = cellsWithFormula.Any();
我使用了 Apache Poi Library...它有以下相关方法
if(cell.getCellType()==CellType.CELL_TYPE_FORMULA)
{
// this cell contains formula......
}
您可以使用OpenXML SDK阅读Xlsx文件。
为此,您需要添加对 OpenXML 库的引用,这可以通过 nuget package 完成(您还需要对 WindowsBase 的引用)。然后您需要加载传播 sheet,找到您感兴趣的 sheet 并迭代单元格。
如果单元格中有公式,每个 Cell
has a CellFormula
属性 都将是非空的。
例如,以下代码将迭代每个单元格并为任何具有公式的单元格输出一行。如果 任何 单元格中有公式,它将 return true
;否则它将 return false
:
public static bool OutputFormulae(string filename, string sheetName)
{
bool hasFormula = false;
//open the document
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filename, false))
{
//get the workbookpart
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
//get the correct sheet
Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).First();
if (sheet != null)
{
//get the corresponding worksheetpart
WorksheetPart worksheetPart = workbookPart.GetPartById(sheet.Id) as WorksheetPart;
//iterate the child Cells
foreach (Cell cell in worksheetPart.Worksheet.Descendants<Cell>())
{
//check for a formula
if (cell.CellFormula != null && !string.IsNullOrEmpty(cell.CellFormula.Text))
{
hasFormula = true;
Console.WriteLine("Cell {0} has the formula {1}", cell.CellReference, cell.CellFormula.Text);
}
}
}
}
return hasFormula;
}
可以使用文件名和您感兴趣的 sheet 的名称来调用,尽管更新代码以迭代 all[=40 是微不足道的=] sheet秒。调用示例:
bool formulaExistsInSheet = OutputFormulae(@"d:\test.xlsx", "Sheet1");
Console.WriteLine("Formula exists? {0}", formulaExistsInSheet);
上面的示例输出:
Cell C1 has the formula A1+B1
Cell B3 has the formula C1*20
Formula exists? True
如果您只对 sheet 中有 any 个单元格有公式感兴趣,您可以使用 Any
简化上述内容扩展方法:
public static bool HasFormula(string filename, string sheetName)
{
bool hasFormula = false;
//open the document
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filename, false))
{
//get the workbookpart
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
//get the correct sheet
Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).First();
if (sheet != null)
{
//get the corresponding worksheetpart
WorksheetPart worksheetPart = workbookPart.GetPartById(sheet.Id) as WorksheetPart;
hasFormula = worksheetPart.Worksheet.Descendants<Cell>().Any(c =>
c.CellFormula != null && !string.IsNullOrEmpty(c.CellFormula.Text));
}
}
return hasFormula;
}
如何通过 oledb reader 在 Excel 中检查单元格是否包含公式?
System.Data.OleDb.OleDbConnection conn2 = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " + strFileName + "; Extended Properties = \"Excel 8.0;HDR=NO;IMEX=1\";");
conn2.Open();
string strQuery2 = "SELECT * FROM [" + Table + "]";
System.Data.OleDb.OleDbDataAdapter adapter2 = new System.Data.OleDb.OleDbDataAdapter(strQuery2, conn2);
System.Data.DataTable DT2 = new System.Data.DataTable();
adapter2.Fill(DT2);
您可以探索这个:Range.HasFormula
在 com-interop
下。
我还注意到有一个 post 可以即兴创作 来满足您的需求。
这是一个框架 - 不是确切的语法。
Excel.Application excelApp = new Excel.Application();
Excel.Workbook workBook = excelApp.Workbooks.Open(filePath);
Excel.WorkSheet WS = workBooks.WorkSheets("Sheet1");
Range rangeData = WS.Range["A1:C3"];
foreach (Excel.Range c in rangeData.Cells)
{
if (c.HasFormula)
{
MessageBox.Show(Convert.ToString(c.Value));
}
}
不确定如何使用 OLEDB
实现此目的,因为您的查询似乎只是 grab 单元格数据(文本、数字、无公式)到查询中.
如果您必须使用 OLEDB
,this post 可能会有所帮助。
如果您仍然需要帮助,请随时发表评论。
我得到了解决方案,但仅限于互操作服务!!
public bool IsFormulaExistInExcel(string excelpath)
{
bool IsFormulaExist = false;
try
{
Microsoft.Office.Interop.Excel.Application excelApp = null;
Microsoft.Office.Interop.Excel.Workbooks workBooks = null;
Microsoft.Office.Interop.Excel.Workbook workBook = null;
Microsoft.Office.Interop.Excel.Worksheet workSheet;
excelApp = new Microsoft.Office.Interop.Excel.Application();
workBooks = excelApp.Workbooks;
workBook = workBooks.Open(excelpath, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
workSheet = workBook.Worksheets.get_Item(1);
Microsoft.Office.Interop.Excel.Range rng = workSheet.UsedRange;
dynamic FormulaExist = rng.HasFormula;
Type unknown = FormulaExist.GetType();
if (unknown.Name == "DBNull")
IsFormulaExist = true;
else if (unknown.Name == "Boolean")
{
if (FormulaExist == false)
IsFormulaExist = false;
else if (FormulaExist == true)
IsFormulaExist = true;
}
}
catch (Exception E)
{
}
return IsFormulaExist;
}
如果您的 excel 文件是 .xlsx,那么,由于 .xlsx 实际上是一个 zip 存档,您可以在其中阅读 xl\calcChain.xml。此文件包含如下条目:
<c r="G3" i="1" l="1"/><c r="A3" i="1" l="1"/>
在此示例中,单元格 G3 和 A3 中有公式。 所以你可以这样做:
// Add references for
// System.IO.Compression
// System.IO.Compression.FileSystem
private static List<string> GetCellsWithFormulaInSheet(string xlsxFileName, int sheetNumber)
{
using (var zip = System.IO.Compression.ZipFile.OpenRead(xlsxFileName))
{
var list = new List<string>();
var entry = zip.Entries.FirstOrDefault(e => e.FullName == "xl/calcChain.xml");
if (entry == null)
return list;
var xdoc = XDocument.Load(entry.Open());
XNamespace ns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
return xdoc.Root.Elements(ns + "c")
.Select(x => new { Cell = x.Attribute("r").Value, Sheet = int.Parse(x.Attribute("i").Value) })
.Where(x => x.Sheet == sheetNumber)
.Select(x => x.Cell)
.ToList();
}
}
然后像这样使用这个方法:
var cellsWithFormula = GetCellsWithFormulaInSheet(@"c:\Book.xlsx", 1);
bool hasFormulaInSheet = cellsWithFormula.Any();
我使用了 Apache Poi Library...它有以下相关方法
if(cell.getCellType()==CellType.CELL_TYPE_FORMULA)
{
// this cell contains formula......
}
您可以使用OpenXML SDK阅读Xlsx文件。
为此,您需要添加对 OpenXML 库的引用,这可以通过 nuget package 完成(您还需要对 WindowsBase 的引用)。然后您需要加载传播 sheet,找到您感兴趣的 sheet 并迭代单元格。
如果单元格中有公式,每个 Cell
has a CellFormula
属性 都将是非空的。
例如,以下代码将迭代每个单元格并为任何具有公式的单元格输出一行。如果 任何 单元格中有公式,它将 return true
;否则它将 return false
:
public static bool OutputFormulae(string filename, string sheetName)
{
bool hasFormula = false;
//open the document
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filename, false))
{
//get the workbookpart
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
//get the correct sheet
Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).First();
if (sheet != null)
{
//get the corresponding worksheetpart
WorksheetPart worksheetPart = workbookPart.GetPartById(sheet.Id) as WorksheetPart;
//iterate the child Cells
foreach (Cell cell in worksheetPart.Worksheet.Descendants<Cell>())
{
//check for a formula
if (cell.CellFormula != null && !string.IsNullOrEmpty(cell.CellFormula.Text))
{
hasFormula = true;
Console.WriteLine("Cell {0} has the formula {1}", cell.CellReference, cell.CellFormula.Text);
}
}
}
}
return hasFormula;
}
可以使用文件名和您感兴趣的 sheet 的名称来调用,尽管更新代码以迭代 all[=40 是微不足道的=] sheet秒。调用示例:
bool formulaExistsInSheet = OutputFormulae(@"d:\test.xlsx", "Sheet1");
Console.WriteLine("Formula exists? {0}", formulaExistsInSheet);
上面的示例输出:
Cell C1 has the formula A1+B1
Cell B3 has the formula C1*20
Formula exists? True
如果您只对 sheet 中有 any 个单元格有公式感兴趣,您可以使用 Any
简化上述内容扩展方法:
public static bool HasFormula(string filename, string sheetName)
{
bool hasFormula = false;
//open the document
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filename, false))
{
//get the workbookpart
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
//get the correct sheet
Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).First();
if (sheet != null)
{
//get the corresponding worksheetpart
WorksheetPart worksheetPart = workbookPart.GetPartById(sheet.Id) as WorksheetPart;
hasFormula = worksheetPart.Worksheet.Descendants<Cell>().Any(c =>
c.CellFormula != null && !string.IsNullOrEmpty(c.CellFormula.Text));
}
}
return hasFormula;
}