source

oledb reader 또는 Excel library, Excel data reader 또는 NPOI 등(Interop 제외)을 통해 셀에 수식이 포함되어 있는지 확인하는 방법?

ittop 2023. 10. 24. 21:34
반응형

oledb reader 또는 Excel library, Excel data reader 또는 NPOI 등(Interop 제외)을 통해 셀에 수식이 포함되어 있는지 확인하는 방법?

oledb reader를 통해 Excel에서 Cell에 수식이 포함되어 있는지 확인하는 방법?

enter image description here

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);

아래에서 탐색할 수 있습니다.com-interop.

저는 또한 당신의 요구를 충족시키기 위해 즉흥적으로 만들 수 있는 게시물이 있다는 것을 알았습니다.

여기 정확한 구문이 아닌 뼈대가 있습니다.

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, 당신의 쿼리는 단지 셀 데이터(공식이 없는 숫자, texts)를 쿼리에 집어넣는 것처럼 보이기 때문입니다.

꼭 사용해야 하는 경우OLEDB, 이 게시물은 시작하는데 도움이 될 수 있습니다.그래도 도움이 필요하다면 언제든지 의견을 내주세요.

해결책을 얻었지만 인터롭 서비스에서만!!

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;
  }

아파치 포이 라이브러리를 사용했습니다...관련 방법이 아래에 있는 것.

if(cell.getCellType()==CellType.CELL_TYPE_FORMULA)
{
// this cell contains formula......
}

OpenXML SDK를 사용하여 Xlsx 파일을 읽을 수 있습니다.

작업을 수행하려면 nuget 패키지를 통해 수행할 수 있는 OpenXML 라이브러리에 참조를 추가해야 합니다(WindowsBase에도 참조가 필요합니다).그런 다음 스프레드시트를 로드하고 관심 있는 시트를 찾아 셀을 반복해야 합니다.

각 셀에는 해당 셀에 공식이 있으면 null이 아닌 속성이 있습니다.

예를 들어, 다음 코드는 각 셀을 반복하고 공식이 있는 셀에 대한 라인을 출력합니다.돌아올 것입니다.true만약 어떤 세포가 그 안에 공식을 가지고 있다면; 그렇지 않으면 그것은 돌아올 것입니다.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;
}

모든 시트를 반복하기 위해 코드를 업데이트하는 것은 사소한 일이지만 파일 이름과 관심 있는 시트 이름으로 호출할 수 있습니다.통화 예시:

bool formulaExistsInSheet = OutputFormulae(@"d:\test.xlsx", "Sheet1");
Console.WriteLine("Formula exists? {0}", formulaExistsInSheet);

위의 출력 예:

셀 C1은 공식 A1+B1을 갖습니다.
셀 B3의 화학식은 C1*20입니다.
공식이 존재합니까? 참

시트에 공식이 있는 셀이 있는 경우에만 관심이 있는 경우 확장 방법을 사용하여 위의 내용을 단순화할 수 있습니다.

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;
}

엑셀 파일이 .xlsx이면 .xlsx는 zip 아카이브이므로 xl\cChain.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();

언급URL : https://stackoverflow.com/questions/30747315/how-to-check-a-cell-contains-formula-or-not-in-excel-through-oledb-reader-or-exc

반응형