我需要加載一個具有多個作業表的檔案 .xlsx。
它看起來像這樣:
第一張作業表:動物園
| 姓名 | 地點 |
|---|---|
| 動物園 | 巴黎 |
| 結尾 |
第二張作業表:動物
| 姓名 | 物種 | 家庭 | 性別 | 出生日期 |
|---|---|---|---|---|
| 佐伊 | 大象 | 象科 | F | 2004 年 3 月 19 日 |
| 勝利者 | 鹿 | 鹿科 | 米 | |
| 卡米爾 | 鷹 | 鷹科 | F | 09/03/2108 |
| 結尾 |
之后我有每個動物的作業表:
佐伊
| 姓名 | 單元 | 價值 |
|---|---|---|
| 高度 | 厘米 | 280 |
| 重量 | 公斤 | 4 000 |
| 結尾 |
勝利者
| 姓名 | 單元 | 價值 |
|---|---|---|
| 高度 | 厘米 | 150 |
| 重量 | 公斤 | 75 |
| 結尾 |
ETC
我有一個函式 Load() 呼叫所有函式來加載我需要的資訊。
public bool Load(string fileName)
{
bool returnValue = false;
if (File.Exists(fileName))
{
SpreadsheetDocument spreadsheetDocument = spreadsheetDocument.Open(fileName, false);
if (LoadZoo(spreadsheetDocument))
{
returnValue = true;
}
if (LoadAnimals(spreadsheetDocument))
{
returnValue = true;
}
spreadsheetDocument.Close();
}
return returnValue;
}
在 LoadAnimals 中,我從第二個作業表中檢索資訊,并呼叫我的函式從所有 Animal Worksheet 中檢索資訊:
public Dictionary<string, IXlsxAnimals> Animals { get; private set; } = new Dictionary<string, IXlsxAnimals>();
private bool LoadAnimals(SpreadsheetDocument spreadsheetDocuement)
{
bool returnValue = false;
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
WorksheetPart worksheetPart = ExcelHelper.GetWorksheetFromSheetname(workbookPart, "Animals");
if (worksheetPart != null)
{
SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
Sheet sheet = workbookPart.workbook.Descendants<Sheet>().FirstOrDefault(s => s.Name == "Animals");
if (sheet.Name == "Animals")
{
Cell cell = worksheetPart.Descendants<Cell>().FirstOrDefault();
string endingCell = "";
while (endingCell != "END")
{
foreach (Row row in sheetData.Descendants<Row>())
{
endingCell = ExcelHelper.GetCellValue(worbookPart, sheetData, $"A{row.RowIndex}");
if (endingCell == null)
{
break;
}
XlsxAnimals xlsxAnimals = new XlsxAnimals()
{
Name = ExcelHelper.GetCellValue(workbookPart, sheetData, $"A{row.RowIndex}"),
Species = ExcelHelper.GetCellValue(workbookPart, sheetData, $"B{row.RowIndex}"),
Family = ExcelHelper.GetCellValue(workbookPart, sheetData, $"C{row.RowIndex}"),
Sex = ExcelHelper.GetCellValue(workbookPart, sheetData, $"D{row.RowIndex}"),
DateOfBirth = ExcelHelper.GetCellValue(workbookPart, sheetData, $"E{row.RowIndex}"),
Animal = new Dictionary<string, IXlsxAnimal>();
};
if (!Animals.ContainsKey(xlsxAnimals.Name))
{
if(xlsxAnimals.Name != "Name")
{
Animals.Add(xlsxAnimals.Name, xlsxAnimals);
LoadAnimal(spreadsheetDocument, xlsxAnimals.Animal, xlsxAnimals);
}
}
returnValue = true;
}
}
}
}
return returnValue;
}
LoadAnimal 看起來像這樣:
private bool LoadAnimal (SpreadsheetDocument spreadsheetDocument, Dictionary<string, IXlsxAnimal> Animal, XlsxAnimals xlsxAnimals)
{
bool returnValue = false;
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
WorksheetPart worksheetPart = ExcelHelper.GetworksheetFromSheetName(workbookPart, xlsxAnimals.Name);
if (worksheetPart != null)
{
SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().FirstOrdefault(s => s.Name == xlsxAnimals.Name);
if (sheet.Name == xlsxAnimals.Name)
{
Cell cell = worksheetPart.Wroksheet.Descendants<Cell>().FirstOrDefault();
string endingCell = "";
while (endingCell != "End")
{
foreach (Row row in sheetData.Descendants<Row>())
{
endingCell = ExcelHelper.GetCellValue(workbookPart, sheetData, $"A{row.RowIndex}");
if (endingCell == null)
{
break;
}
XlsxAnimal xlsxAnimal = new XlsxAnimal()
{
Name = ExcelHelper.GetCellValue(workbookPart, sheetData, $"A{row.RowIndex}"),
Unit = ExcelHelper.GetCellValue(workbookPart, sheetData, $"B{row.RowIndex}"),
Value = ExcelHelper.GetCellValue(workbookPart, sheetData, $"C{row.RowIndex}")
};
if (!Animal.ContainKey(XlsxAnimal.Name))
{
if (XlsxAnimal.Name != "Name")
{
Animal.Add(xlsxAnimal.Name, xlsxAnimal);
}
}
returnValue = true;
}
}
}
}
return returnValue;
}
我所有的代碼都運行起來,我可以檢索到我想要的所有資訊。
我想讓我的 LoadAnimal() 函式在我的函式 Load() 中而不是在 LoadAnimals() 中
public bool Load(string fileName)
{
bool returnValue = false;
if (File.Exists(fileName))
{
SpreadsheetDocument spreadsheetDocument = spreadsheetDocument.Open(fileName, false);
if (LoadZoo(spreadsheetDocument))
{
returnValue = true;
}
if (LoadAnimals(spreadsheetDocument))
{
returnValue = true;
}
if (LoadAnimal(spreadsheetDocument))
{
returnValue = true;
}
spreadsheetDocument.Close();
}
return returnValue;
}
類似的東西,但我不知道使用什么作為引數或如何移動函式以使其作業。
uj5u.com熱心網友回復:
首先,在您的 LoadAnimals 中注釋以下行:
if (!Animals.ContainsKey(xlsxAnimals.Name))
{
if(xlsxAnimals.Name != "Name")
{
Animals.Add(xlsxAnimals.Name, xlsxAnimals);
//LoadAnimal(spreadsheetDocument, xlsxAnimals.Animal, xlsxAnimals);
}
}
其次,更改您的 Load 方法如下:
public bool Load(string fileName)
{
bool returnValue = false;
if (File.Exists(fileName))
{
SpreadsheetDocument spreadsheetDocument = spreadsheetDocument.Open(fileName, false);
if (LoadZoo(spreadsheetDocument))
{
returnValue = true;
}
if (LoadAnimals(spreadsheetDocument))
{
returnValue = true;
}
// Load the details of each animal here:
foreach (var animal in Animals)
{
if (LoadAnimal(spreadsheetDocument, animal.Value, animal))
{
returnValue = true;
}
}
spreadsheetDocument.Close();
}
return returnValue;
}
uj5u.com熱心網友回復:
正如@Sergey 回答我的那樣,我確實評論了我的臺詞LoadAnimals()
然后我Load()像這樣寫了我的方法:
public bool Load(string fileName)
{
bool returnValue = false;
if (File.Exists(fileName))
{
SpreadsheetDocument spreadsheetDocument = spreadsheetDocument.Open(fileName, false);
if (LoadZoo(spreadsheetDocument))
{
returnValue = true;
}
if (LoadAnimals(spreadsheetDocument))
{
returnValue = true;
}
foreach (XlsxAnimals xlsxAnimals in Animals.Values)
{
if (LoadAnimal(spreadsheetDocument, xlsxAnimals.Animal, xlsxAnimals))
{
returnValue = true;
}
}
spreadsheetDocument.Close();
}
return returnValue;
}
一切運行完美,謝謝。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/531624.html
標籤:C#擅长xml打开xml
