Open XML SDK 2.0을 사용하여 Excel 2007 통합 문서의 단일 워크 시트에서 데이터를 읽어야합니다. 이 작업을 수행하는 데 필요한 기본 지침을 검색하는 데 많은 시간을 할애했지만 스프레드 시트를 만드는 데 도움을 얻었습니다.OpenXML 형식 SDK를 사용하여 스프레드 시트에서 데이터를 읽으려면 어떻게해야합니까?
워크 시트의 행을 반복 한 다음이 SDK를 사용하여 각 행의 셀을 반복하는 방법은 무엇입니까?
Open XML SDK 2.0을 사용하여 Excel 2007 통합 문서의 단일 워크 시트에서 데이터를 읽어야합니다. 이 작업을 수행하는 데 필요한 기본 지침을 검색하는 데 많은 시간을 할애했지만 스프레드 시트를 만드는 데 도움을 얻었습니다.OpenXML 형식 SDK를 사용하여 스프레드 시트에서 데이터를 읽으려면 어떻게해야합니까?
워크 시트의 행을 반복 한 다음이 SDK를 사용하여 각 행의 셀을 반복하는 방법은 무엇입니까?
내가하는 방법은 Linq입니다. SDK를 사용하여 순수한 Open XML (SDK 없음)로만이 주제에 관한 샘플이 많이 있습니다. 아마 (
안녕하세요, 토드, 저 좀 도와주세요. 나는 다음과 같은 문제가있다 : http://stackoverflow.com/questions/15791732/openxml-sdk-having-borders-for-cell 미리 감사드립니다 - Nate –
@NatePet, 이것에 대해 미안, 나는 전부가 아니다. Excel에 익숙한 분이라면 대답을 찾기에는 너무 오래 걸릴 것입니다. –
다른 답변은 메타 답변과 비슷하게 보입니다. LINQ를 사용하면 분리 된 문서 부분을 사용할 수 있으므로이 작업에 어려움을 겪고 있습니다. 다음 코드에는 가능한 문자열 조회를 해결하는 셀에서 값을 가져 오는 래퍼 함수가 포함되어 있습니다.
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;
}
편집 : 감사 @Nitin-Jadhav GetCellValue에 대한 보정().
안녕하세요, 저를 도울 수 있습니까? http://stackoverflow.com/questions/15791732/openxml-sdk-having-borders-for-cell에 문제가 있습니다. –
매우 유용합니다. 감사. –
정말 좋은 예입니다. 정말로 효과가 있습니다. 감사합니다! – berliner
@Otaku, 나는 조사 할 기회가 없었지만, 당신이 준 링크를 훑어 보면 그들이 매우 가치 있고 아마도 내 질문에 답할 가능성이 높습니다. 감사. – ProfK
아직 조사 할 기회가 있었습니까? 내가 더 이상 도움이 될 수 있다면 알려줘. –
예, @ 오타쿠, 고마워요. "LINQ 사용"기사는 행과 셀을 반복하는 것을 제외하고는 아무 일도하지 않지만 시트에 액세스하는 방법 만 보여줍니다. – ProfK