C# 缺少使用OpenXml解析Excel文件的列
我发现使用OpenXml时,我的列并不总是排成一行。例如,看看这个例子 这是标题行 第37列=仅交换 第38列=现有数量 第39列=成本法 第40列=成本法金额 现在,在下一行中,在37和38中都有实际数据的那一行是空的,但它省略了第38列。我的数据是这样的 第37列=应为空 第38列=设置金额应为空,因为它应与“现有数量”对齐 第39列=0 注意,它去掉了真正的列/单元格38,现在我的解析器不再对齐。37和38都是空的,但不会丢失37 下面是一些代码来说明我是如何使用字符串数组的——它实际上只是MSDN中的一个修改示例C# 缺少使用OpenXml解析Excel文件的列,c#,openxml,C#,Openxml,我发现使用OpenXml时,我的列并不总是排成一行。例如,看看这个例子 这是标题行 第37列=仅交换 第38列=现有数量 第39列=成本法 第40列=成本法金额 现在,在下一行中,在37和38中都有实际数据的那一行是空的,但它省略了第38列。我的数据是这样的 第37列=应为空 第38列=设置金额应为空,因为它应与“现有数量”对齐 第39列=0 注意,它去掉了真正的列/单元格38,现在我的解析器不再对齐。37和38都是空的,但不会丢失37 下面是一些代码来说明我是如何使用字符串数组的——它实际上只
public InventoryItemLoadProxy CreateInventoryItemFromSpreadsheetRow(Row row, SharedStringTable sharedStrings)
{
var invItem = new InventoryItemLoadProxy();
var theCells = row.Descendants<Cell>();
var textValues =
from cell in row.Descendants<Cell>()
select(cell.CellValue == null ? string.Empty : ((cell.DataType != null
&& cell.DataType.HasValue
&& cell.DataType == CellValues.SharedString) ? sharedStrings.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText : cell.CellValue.InnerText));
if(textValues.Any(x => x != string.Empty))
{
var textArray = textValues.ToArray();
invItem.PartNumber = textArray[0].ToStrippedPartNumber();
invItem.DisplayPartNumber = textArray[0];
//More parsing...
}
}
你可以看到我的意思是,如果它是null,就让它成为string.empty是的-那个疯狂的linq语句在某个时候会被重构。因为其他人已经回答了这个问题。看见我使用了一种更为野蛮和无知的方法,尽管一旦有机会从另一个答案对代码进行单元测试,我可能会进行重构。不过,这满足了我目前的需要
private int GetIndexFromCellRef(Cell cell)
{
var colname = cell.CellReference.Value;
colname = Regex.Replace(colname, "[0-9]", "");
var indexList = new Dictionary<string, int>
{
{"A", 0},
{"B", 1},
{"C", 2},
{"D", 3},
{"E", 4},
{"F", 5},
{"G", 6},
{"H", 7},
{"I", 8},
{"J", 9},
{"K", 10},
{"L", 11},
{"M", 12},
{"N", 13},
{"O", 14},
{"P", 15},
{"Q", 16},
{"R", 17},
{"S", 18},
{"T", 19},
{"U", 20},
{"V", 21},
{"W", 22},
{"X", 23},
{"Y", 24},
{"Z", 25},
{"AA", 26},
{"AB", 27},
{"AC", 28},
{"AD", 29},
{"AE", 30},
{"AF", 31},
{"AG", 32},
{"AH", 33},
{"AI", 34},
{"AJ", 35},
{"AK", 36},
{"AL", 37},
{"AM", 38},
{"AN", 39},
{"AO", 40},
{"AP", 41},
{"AQ", 42},
{"AR", 43},
{"AS", 44},
{"AT", 45},
{"AU", 46},
{"AV", 47},
{"AW", 48},
{"AX", 49},
{"AY", 50},
{"AZ", 51},
{"BA", 52},
{"BB", 53},
{"BC", 54},
{"BD", 55},
{"BE", 56},
{"BF", 57},
{"BG", 58},
{"BH", 59},
{"BI", 60},
{"BJ", 61},
{"BK", 62},
{"BL", 63},
{"BM", 64},
{"BN", 65},
{"BO", 66},
{"BP", 67},
{"BQ", 68}
};
if (indexList.ContainsKey(colname))
return indexList.First(x => x.Key.Equals(colname)).Value;
return -1;
}