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
요소의 자식이 있는 요소Sheet
Excel 파일의 각 워크시트에 해당합니다.당신이 해야 할 일은 그것으로부터 정확한 색인을 얻는 것입니다.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
'programing' 카테고리의 다른 글
Node/Express 응용 프로그램에서 MySQL 연결이 누출되는 이유는 무엇입니까? (0) | 2023.06.18 |
---|---|
Mongoose의 배열 스키마로 개체 밀어넣기 (0) | 2023.06.18 |
*.so 파일에서 기능하도록 기능 주소를 매핑하는 방법 (0) | 2023.06.18 |
j선택한 값 가져오기 라디오 버튼 쿼리 (0) | 2023.06.18 |
Java JDBC - tnsnames.ora를 사용하여 Oracle에 연결하는 방법 (0) | 2023.06.18 |