1
私はOpenXMLを使用してExcelをDataTableにインポートしています。私の最初の行は、タイトル情報だけを表示するためにマージされ、2番目の行はヘッダー行です。 ExcelファイルからDataTableを読み込んでいる間、私は間違ったデータを取得しています。空白のセルが存在するまで、DataTableは正しく挿入されます。ブランクセルがある場合、それらは隣接するデータ提示セルに移動している。なぜこうなった?コード内の問題は何ですか? OpenXMLを使用して適切な方法でデータを取得するのを手伝ってください。一度データをインポートすると、ここに私のExcelファイルとデータテーブルがあります。ExcelをDataTableにインポートすると、OpenXMLを使ってデータが正しく取得されない
私のコードサンプルは以下の通りです:
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace OpenXMLDemo
{
class Program
{
static void Main(string[] args)
{
Program p = new Program();
var data = p.ExtractExcel(@"C:\TempData\");
}
public System.Data.DataTable ExtractExcel(string fullPath)
{
var excelFileToImport = Directory.GetFiles(fullPath, "Data_Import.xlsx", SearchOption.AllDirectories);
//Create a new DataTable.
System.Data.DataTable dt = new System.Data.DataTable();
//Open the Excel file in Read Mode using OpenXML
using (SpreadsheetDocument doc = SpreadsheetDocument.Open(excelFileToImport[0], false))
{
WorksheetPart titlesWorksheetPart = GetWorksheetPart(doc.WorkbookPart, "Titles");
Worksheet titlesWorksheet = titlesWorksheetPart.Worksheet;
//Fetch all the rows present in the worksheet
IEnumerable<Row> rows = titlesWorksheet.GetFirstChild<SheetData>().Descendants<Row>();
//Loop through the Worksheet rows
foreach (Row row in rows)
{
//Use the first row to add columns to DataTable.
if (row.RowIndex.Value == 1)
{
}
else if (row.RowIndex.Value == 2)
{
foreach (Cell cell in row.Descendants<Cell>())
{
dt.Columns.Add(GetValue(doc, cell));
}
}
else
{
//Add rows to DataTable.
dt.Rows.Add();
int i = 0;
foreach (Cell cell in row.Descendants<Cell>())
{
dt.Rows[dt.Rows.Count - 1][i] = GetValue(doc, cell);
i++;
}
}
}
}
return dt;
}
private string GetValue(SpreadsheetDocument doc, Cell cell)
{
string value = cell.CellValue.InnerText;
if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
{
return doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements.GetItem(int.Parse(value)).InnerText;
}
return value;
}
public WorksheetPart GetWorksheetPart(WorkbookPart workbookPart, string sheetName)
{
string relId = workbookPart.Workbook.Descendants<Sheet>().First(s => sheetName.Equals(s.Name)).Id;
return (WorksheetPart)workbookPart.GetPartById(relId);
}
}
}
の可能性のある重複した[C#OPENのXML:DATATABLEにEXCELからデータを取得中に空のセルがスキップなっています](https://stackoverflow.com/questions/36100011/c-sharp-open-xml-empty-セルを取得中にスキップしながらデータを取得する間に) – PaulF
空のセルがリストされていない - セルのデータを格納する列を確認するには、CellReferenceをチェックする必要があります。あなたが望むことをやりなさい。 – PaulF