试图读取C#中的Excel文件文件stream,我得到的是数字而不是文本

我正在尝试使用DocumentFormat.OpenXml来读取上传的Excel文件。 当我得到的文件(HttpPosteFileWrapper)我只是想读取单元格,并将其写入到文本string。 (后来我会做更多的,但我只是想习惯现在的OpenXml。)

我在Excel中的数据看起来像这样:

Field1 – Field2 – 电话 – 城市
IT部门 – 雇员 – 7175551234 – 斯普林菲尔德
HR – Emp – 7175556543 – W Springfield

代码如下所示:

var doc = SpreadsheetDocument.Open(file.InputStream, false); WorkbookPart workbookPart = doc.WorkbookPart; WorksheetPart worksheetPart = workbookPart.WorksheetParts.First(); SheetData thisSheet = worksheetPart.Worksheet.Elements<SheetData>().First(); System.Text.StringBuilder text = new System.Text.StringBuilder(); foreach (Row r in thisSheet.Elements<Row>()) { foreach (Cell c in r.Elements<Cell>()) { text.Append(c.CellValue.Text + ","); } text.AppendLine(); } 

它创build的string如下所示:

49,51,50,0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,14,15,17,18,19,20,21, 22,40,41,42,43,44,45,54,\ r \ n
52,24,23,25,26,27,7306,33,28,29,30,31,17033,32,34,7175555555,7175551234,7175554321,7175550000,35,36,37,36526,40179,38, 39,30,31,17033,32,55,\ r \ n
53,46,47,48,555,\ r \ n

这似乎是数值通过。 是因为我使用错误的streamtypes?

编辑:我已经更新我的代码现在看起来像这样,但它仍然无法正常工作。 我似乎没有办法看到文本数据。

 public ActionResult ProfileImport(IEnumerable<HttpPostedFileBase> files) { // Build file list int i = 1; foreach (var file in files) { if (file.ContentLength > 0) { var doc = SpreadsheetDocument.Open(file.InputStream, false); WorkbookPart workbookPart = doc.WorkbookPart; WorksheetPart worksheetPart = workbookPart.WorksheetParts.First(); SheetData thisSheet = worksheetPart.Worksheet.Elements<SheetData>().First(); System.Text.StringBuilder text = new System.Text.StringBuilder(); foreach (Row r in thisSheet.Elements<Row>()) { foreach (Cell c in r.Elements<Cell>()) { string value = c.InnerText; if (c.DataType != null && c.DataType.Value == CellValues.SharedString) // Check DataType exists { var stringTable = workbookPart.GetPartsOfType<SharedStringTablePart>() .FirstOrDefault(); // Get Table parts from workbookPart if (stringTable != null) value = stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText; text.Append(value + ","); } else text.Append(value + ","); } text.AppendLine(); } var outText = text.ToString(); } } } 

来自文件第一行的实际数据:
AddressDescription,Address1,Address2,City,State,PostalCode,CountryCode,Email,CellPhone,HomePhone,WorkPhone,Fax,OrganizationName,Department,Position,StartDate,EndDate,OrganizationAddress1,OrganizationAddress2 OrganizationCity,OrganizationState,OrganizationPostalCode,OrganizationCountryCode,Keywords

该行的Row.InnerText:
“49515001234567891011121316141517181920212240414243444554”

Row.OuterXml:

 "<x:row r=\"1\" spans=\"1:33\" s=\"3\" customFormat=\"1\" x14ac:dyDescent=\"0.25\" xmlns:x14ac=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\" xmlns:x=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"> <x:cr=\"A1\" s=\"3\" t=\"s\"><x:v>49</x:v></x:c> <x:cr=\"B1\" s=\"3\" t=\"s\"><x:v>51</x:v></x:c> <x:cr=\"C1\" s=\"3\" t=\"s\"><x:v>50</x:v></x:c> <x:cr=\"D1\" s=\"3\" t=\"s\"><x:v>0</x:v></x:c> <x:cr=\"E1\" s=\"3\" t=\"s\"><x:v>1</x:v></x:c> <x:cr=\"F1\" s=\"3\" t=\"s\"><x:v>2</x:v></x:c> <x:cr=\"G1\" s=\"3\" t=\"s\"><x:v>3</x:v></x:c> <x:cr=\"H1\" s=\"3\" t=\"s\"><x:v>4</x:v></x:c> <x:cr=\"I1\" s=\"3\" t=\"s\"><x:v>5</x:v></x:c> <x:cr=\"J1\" s=\"3\" t=\"s\"><x:v>6</x:v></x:c> <x:cr=\"K1\" s=\"3\" t=\"s\"><x:v>7</x:v></x:c> <x:cr=\"L1\" s=\"3\" t=\"s\"><x:v>8</x:v></x:c> <x:cr=\"M1\" s=\"3\" t=\"s\"><x:v>9</x:v></x:c> <x:cr=\"N1\" s=\"3\" t=\"s\"><x:v>10</x:v></x:c> <x:cr=\"O1\" s=\"3\" t=\"s\"><x:v>11</x:v></x:c> <x:cr=\"P1\" s=\"4\" t=\"s\"><x:v>12</x:v></x:c> <x:cr=\"Q1\" s=\"4\" t=\"s\"><x:v>13</x:v></x:c> <x:cr=\"R1\" s=\"3\" t=\"s\"><x:v>16</x:v></x:c> <x:cr=\"S1\" s=\"3\" t=\"s\"><x:v>14</x:v></x:c> <x:cr=\"T1\" s=\"3\" t=\"s\"><x:v>15</x:v></x:c> <x:cr=\"U1\" s=\"3\" t=\"s\"><x:v>17</x:v></x:c> <x:cr=\"V1\" s=\"3\" t=\"s\"><x:v>18</x:v></x:c> <x:cr=\"W1\" s=\"3\" t=\"s\"><x:v>19</x:v></x:c> <x:cr=\"X1\" s=\"3\" t=\"s\"><x:v>20</x:v></x:c> <x:cr=\"Y1\" s=\"3\" t=\"s\"><x:v>21</x:v></x:c> <x:cr=\"Z1\" s=\"3\" t=\"s\"><x:v>22</x:v></x:c> <x:cr=\"AA1\" s=\"3\" t=\"s\"><x:v>40</x:v></x:c> <x:cr=\"AB1\" s=\"3\" t=\"s\"><x:v>41</x:v></x:c> <x:cr=\"AC1\" s=\"3\" t=\"s\"><x:v>42</x:v></x:c> <x:cr=\"AD1\" s=\"3\" t=\"s\"><x:v>43</x:v></x:c> <x:cr=\"AE1\" s=\"3\" t=\"s\"><x:v>44</x:v></x:c> <x:cr=\"AF1\" s=\"3\" t=\"s\"><x:v>45</x:v></x:c> <x:cr=\"AG1\" s=\"3\" t=\"s\"><x:v>54</x:v></x:c> </x:row>" 

看起来这些是“共享string”表中string的索引。 在Excel文件格式中,string数据存储在共享的string表中,然后在单元级别进行引用。 根据文档,如果数据types是文本, CellValue返回StringTable的索引。

https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.cellvalue%28v=office.14%29.aspx?f=255&MSPPError=-2147217396

不知道更多关于您的单元格中的数据的types(有不同的方式来检索基于数据types)。 如果这是我的想法,它将是一个SharedString ,您将需要检索为SharedStringTablePart,如此MSDN页面所示:

https://msdn.microsoft.com/en-us/library/hh298534%28v=office.14%29.aspx?f=255&MSPPError=-2147217396

你的代码看起来像这样:

 foreach (Cell c in r.Elements<Cell>()) { string value = c.InnerText; if (c.DataType.Value == CellValues.SharedString) { var stringTable = worksheetPart.GetPartsOfType<SharedStringTablePart>() .FirstOrDefault(); if (stringTable != null) value = stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText; text.Append(value + ","); } else text.Append(value + ","); text.AppendLine(); } 

我有同样的问题,发现解决scheme,你只需要添加这个方法,你会得到确切的文字,你需要的,而不是数字:

  private string ReadExcelCell(Cell cell, WorkbookPart workbookPart) { var cellValue = cell.CellValue; var text = (cellValue == null) ? cell.InnerText : cellValue.Text; if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString)) { text = workbookPart.SharedStringTablePart.SharedStringTable .Elements<SharedStringItem>().ElementAt( Convert.ToInt32(cell.CellValue.Text)).InnerText; } return (text ?? string.Empty).Trim(); }