programing

OpenXML 형식 SDK를 사용하여 스프레드시트에서 데이터를 읽는 방법은 무엇입니까?

newsource 2023. 6. 9. 22:03

OpenXML 형식 SDK를 사용하여 스프레드시트에서 데이터를 읽는 방법은 무엇입니까?

Open XML SDK 2.0을 사용하여 Excel 2007 워크북의 단일 워크시트에서 데이터를 읽어야 합니다.이 작업에 대한 기본 지침을 검색하는 데 많은 시간을 할애했지만 스프레드시트 작성에 대한 도움말만 발견했습니다.

이 SDK를 사용하여 워크시트에서 행을 반복한 다음 각 행의 셀을 반복하는 방법은 무엇입니까?

다른 대답은 메타답변에 가까웠습니다.LINQ를 사용하면 문서 부품이 분리되어 작동하기 때문에 어려움을 겪고 있습니다.다음 코드에는 가능한 문자열 검색을 해결하는 Cell에서 값을 가져오는 래퍼 함수가 포함되어 있습니다.

public void ExcelDocTest()
{
    Debug.WriteLine("Running through sheet.");
    int rowsComplete = 0;

    using (SpreadsheetDocument spreadsheetDocument =
                    SpreadsheetDocument.Open(@"path\to\Spreadsheet.xlsx", false))
    {
        WorkbookPart workBookPart = spreadsheetDocument.WorkbookPart;

        foreach (Sheet s in workBookPart.Workbook.Descendants<Sheet>())
        {
            WorksheetPart wsPart = workBookPart.GetPartById(s.Id) as WorksheetPart;
            Debug.WriteLine("Worksheet {1}:{2} - id({0}) {3}", s.Id, s.SheetId, s.Name,
                wsPart == null ? "NOT FOUND!" : "found.");

            if (wsPart == null)
            {
                continue;
            }

            Row[] rows = wsPart.Worksheet.Descendants<Row>().ToArray();

            //assumes the first row contains column names 
            foreach (Row row in wsPart.Worksheet.Descendants<Row>())
            {
                rowsComplete++;

                bool emptyRow = true;
                List<object> rowData = new List<object>();
                string value;

                foreach (Cell c in row.Elements<Cell>())
                {
                    value = GetCellValue(c);
                    emptyRow = emptyRow && string.IsNullOrWhiteSpace(value);
                    rowData.Add(value);
                }

                Debug.WriteLine("Row {0}: {1}", row,
                    emptyRow ? "EMPTY!" : string.Join(", ", rowData));
            }
        }

    }
    Debug.WriteLine("Done, processed {0} rows.", rowsComplete);
}

public static string GetCellValue(Cell cell)
{
    if (cell == null)
        return null;
    if (cell.DataType == null)
        return cell.InnerText;

    string value = cell.InnerText;
    switch (cell.DataType.Value)
    {
        case CellValues.SharedString:
            // For shared strings, look up the value in the shared strings table.
            // Get worksheet from cell
            OpenXmlElement parent = cell.Parent;
            while (parent.Parent != null && parent.Parent != parent
                    && string.Compare(parent.LocalName, "worksheet", true) != 0)
            {
                parent = parent.Parent;
            }
            if (string.Compare(parent.LocalName, "worksheet", true) != 0)
            {
                throw new Exception("Unable to find parent worksheet.");
            }

            Worksheet ws = parent as Worksheet;
            SpreadsheetDocument ssDoc = ws.WorksheetPart.OpenXmlPackage as SpreadsheetDocument;
            SharedStringTablePart sstPart = ssDoc.WorkbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();

            // lookup value in shared string table
            if (sstPart != null && sstPart.SharedStringTable != null)
            {
                value = sstPart.SharedStringTable.ElementAt(int.Parse(value)).InnerText;
            }
            break;

        //this case within a case is copied from msdn. 
        case CellValues.Boolean:
            switch (value)
            {
                case "0":
                    value = "FALSE";
                    break;
                default:
                    value = "TRUE";
                    break;
            }
            break;
    }
    return value;
}

편집: GetCellValue()에 대한 수정에 대해 @Nitin-Jadhav에게 감사드립니다.

제가 하는 방법은 린크입니다.SDK를 사용하는 것부터 순수한 Open XML(SDK 없음)을 사용하는 것까지 이 주제에 대한 많은 샘플이 있습니다.다음을 살펴보십시오.

언급URL : https://stackoverflow.com/questions/2624333/how-do-i-read-data-from-a-spreadsheet-using-the-openxml-format-sdk