programing

OpenXML을 사용하여 Excel 시트에서 탭 이름을 검색하는 방법

oldcodes 2023. 6. 18. 16:18
반응형

OpenXML을 사용하여 Excel 시트에서 탭 이름을 검색하는 방법

저는 182개의 열이 있는 스프레드시트 문서를 가지고 있습니다.스프레드시트 데이터를 탭별로 데이터 테이블에 배치해야 하지만 각 탭의 데이터를 추가할 때 탭 이름이 무엇인지 확인하고 데이터 테이블의 열에 탭 이름을 추가해야 합니다.

이것이 제가 데이터 테이블을 설정하는 방법입니다.

그런 다음 워크북을 루프하여 아래로 드릴다운합니다.sheetData개체를 선택하고 각 행과 열을 차례로 이동하여 셀 데이터를 가져옵니다.

DataTable dt = new DataTable();
for (int i = 0; i <= col.GetUpperBound(0); i++)
{
    try
    {
        dt.Columns.Add(new DataColumn(col[i].ToString(), typeof(string)));
    }
    catch (Exception e)
    {
        MessageBox.Show("Uploader  Error" + e.ToString());
        return null;
    }
}

dt.Columns.Add(new DataColumn("SheetName", typeof(string)));

그러나 데이터 테이블에 사용하는 문자열 배열 끝에 탭 이름을 추가해야 합니다.Open XML에서 시트를 루프할 때 탭 이름을 어떻게 알 수 있습니까?

지금까지 제 코드는 다음과 같습니다.

using (SpreadsheetDocument spreadSheetDocument = 
           SpreadsheetDocument.Open(Destination, false))
{
    WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
    Workbook workbook = spreadSheetDocument.WorkbookPart.Workbook;

    Sheets sheets = 
        spreadSheetDocument
            .WorkbookPart
            .Workbook
            .GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>();

    OpenXmlElementList list = sheets.ChildElements;

    foreach (WorksheetPart worksheetpart in workbook.WorkbookPart.WorksheetParts)
    {
        Worksheet worksheet = worksheetpart.Worksheet;

        foreach (SheetData sheetData in worksheet.Elements<SheetData>())
        {
            foreach (Row row in sheetData.Elements())
            {
                string[] thisarr = new string[183];
                int index = 0;
                foreach (Cell cell in row.Elements())
                {
                    thisarr[(index)] = GetCellValue(spreadSheetDocument, cell);
                    index++;
                }
                thisarr[182] = ""; //need to add tabname here
                if (thisarr[0].ToString() != "")
                {
                    dt.Rows.Add(thisarr);
                }
            }
        }
    }
}

return dt;

참고 사항:이전에 "list"의 InnerXML 속성에서 탭 이름을 가져왔습니다.

OpenXmlElementList list = sheets.ChildElements;

그러나 스프레드시트를 반복하는 동안 탭 이름이 올바른 순서로 표시되지 않습니다.

다음은 워크시트에 해당하는 시트를 가져오는 유용한 도우미 방법입니다. 부품:

public static Sheet GetSheetFromWorkSheet
    (WorkbookPart workbookPart, WorksheetPart worksheetPart)
{
    string relationshipId = workbookPart.GetIdOfPart(worksheetPart);
    IEnumerable<Sheet> sheets = workbookPart.Workbook.Sheets.Elements<Sheet>();
    return sheets.FirstOrDefault(s => s.Id.HasValue && s.Id.Value == relationshipId);
}

그런 다음 시트에서 이름을 가져올 수 있습니다. Name-property:

Sheet sheet = GetSheetFromWorkSheet(myWorkbookPart, myWorksheetPart);
string sheetName = sheet.Name;

..."탭 이름" OP가 참조됩니다.


기록의 경우 반대 방법은 다음과 같습니다.

public static Worksheet GetWorkSheetFromSheet(WorkbookPart workbookPart, Sheet sheet)
{
    var worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);
    return worksheetPart.Worksheet;
}

...이를 통해 다음과 같은 방법을 추가할 수도 있습니다.

public static IEnumerable<KeyValuePair<string, Worksheet>> GetNamedWorksheets
    (WorkbookPart workbookPart)
{
    return workbookPart.Workbook.Sheets.Elements<Sheet>()
        .Select(sheet => new KeyValuePair<string, Worksheet>
            (sheet.Name, GetWorkSheetFromSheet(workbookPart, sheet)));
}

이제 이름을 포함한 모든 워크시트를 쉽게 열거할 수 있습니다.

원하는 경우 이름 기반 검색을 위해 사전에 모두 입력합니다.

IDictionary<string, WorkSheet> wsDict = GetNamedWorksheets(myWorkbookPart)
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

...또는 이름으로 특정 시트를 하나만 원하는 경우:

public static Sheet GetSheetFromName(WorkbookPart workbookPart, string sheetName)
{
    return workbookPart.Workbook.Sheets.Elements<Sheet>()
        .FirstOrDefault(s => s.Name.HasValue && s.Name.Value == sheetName);
}

(그러면 호출)GetWorkSheetFromSheet해당 워크시트를 가져옵니다.)

시트 이름은 다음에 저장됩니다.WorkbookPart순식간에Sheets요소의 자식이 있는 요소SheetExcel 파일의 각 워크시트에 해당합니다.당신이 해야 할 일은 그것으로부터 정확한 색인을 얻는 것입니다.Sheets요소 그리고 그것이 될 것입니다.Sheet당신은 당신의 루프에 있습니다.당신이 원하는 것을 하기 위해 아래에 코드 조각을 추가했습니다.

int sheetIndex = 0;
foreach (WorksheetPart worksheetpart in workbook.WorkbookPart.WorksheetParts)
{                     
    Worksheet worksheet = worksheetpart.Worksheet;

    // Grab the sheet name each time through your loop
    string sheetName = workbookPart.Workbook.Descendants<Sheet>().ElementAt(sheetIndex).Name;

    foreach (SheetData sheetData in worksheet.Elements<SheetData>())
    {

       ...
    }
    sheetIndex++;
}
    Using spreadsheetDocument As SpreadsheetDocument = spreadsheetDocument.Open("D:\Libro1.xlsx", True)

        Dim workbookPart As WorkbookPart = spreadsheetDocument.WorkbookPart

        workbookPart.Workbook.Descendants(Of Sheet)()



        Dim worksheetPart As WorksheetPart = workbookPart.WorksheetParts.Last
        Dim text As String



        For Each Sheet As Sheet In spreadsheetDocument.WorkbookPart.Workbook.Sheets
            Dim sName As String = Sheet.Name
            Dim sID As String = Sheet.Id

            Dim part As WorksheetPart = workbookPart.GetPartById(sID)
            Dim actualSheet As Worksheet = part.Worksheet

            Dim sheetData As SheetData = part.Worksheet.Elements(Of SheetData)().First

            For Each r As Row In sheetData.Elements(Of Row)()
                For Each c As Cell In r.Elements(Of Cell)()
                    text = c.CellValue.Text
                    Console.Write(text & " ")
                Next
            Next
        Next

    End Using

    Console.Read()
worksheet.GetAttribute("name","").Value

언급URL : https://stackoverflow.com/questions/7504285/how-to-retrieve-tab-names-from-excel-sheet-using-openxml

반응형