有没有办法保存文本格式在Excel中从C#中提取工作表并将值存储到string?

我正在试图做的事情:

我正在阅读Excel工作表中的单元格值,而且文本通常具有特殊的格式,如上标和下标。 我想保留这种格式,当把它带到我的C#应用​​程序,使用各种标签等string。 但是,就目前的实现而言,所有上标和下标字符都会丢失格式。 我认为这与我在整个过程中将事物分成不同types的事实有关:

const string fileName = "C:\\Users\\J.Smith\\Desktop\\FeatureInfoPropertyAttributesEXCEL.xlsx"; // Prepare the required items Workbook wb = null; // Start Excel Application excel = new Application {Visible = false}; try { // Open file Workbook wb = excel.Workbooks.Open(fileName); // Read sheets Sheets sheets = wb.Worksheets; // Select sheet Worksheet ws = (Worksheet) sheets.Item["FeatureInfoPropertyAttributes"]; string firstCellForPropertiesRange = "A2"; string secondCellForPropertiesRange = ws.Range[firstCellForPropertiesRange].End[XlDirection.xlDown].Address; string firstCellForHeadersRange = firstCellForPropertiesRange.Replace("A", "B"); string secondCellForHeadersRange = secondCellForPropertiesRange.Replace("A", "B"); string firstCellForProposedHeadersRange1 = firstCellForHeadersRange.Replace("B", "C"); string secondCellForProposedHeadersRange1 = secondCellForHeadersRange.Replace("B", "C"); string firstCellForProposedHeadersRange2 = firstCellForProposedHeadersRange1.Replace("C", "D"); string secondCellForProposedHeadersRange2 = secondCellForProposedHeadersRange1.Replace("C", "D"); Range propertiesRange = ws.Range[firstCellForPropertiesRange, secondCellForPropertiesRange]; Range headersRange = ws.Range[firstCellForHeadersRange, secondCellForHeadersRange]; Range proposedHeadersRange1 = ws.Range[firstCellForProposedHeadersRange1, secondCellForProposedHeadersRange1]; Range proposedHeadersRange2 = ws.Range[firstCellForProposedHeadersRange2, secondCellForProposedHeadersRange2]; List<string> properties = propertiesRange.Cells.Cast<object>() .Select((t, i) => ((Range) propertiesRange.Cells[i + 1]).Value2 ?? string.Empty) .Cast<string>() .ToList(); List<string> existingHeaders = headersRange.Cells.Cast<object>() .Select((t, i) => ((Range) headersRange.Cells[i + 1]).Value2 ?? string.Empty) .Cast<string>() .ToList(); List<string> proposedHeaders1 = proposedHeadersRange1.Cells.Cast<object>() .Select( (t, i) => ((Range) proposedHeadersRange1.Cells[i + 1]).Value2 ?? string.Empty) .Cast<string>() .ToList(); List<string> proposedHeaders2 = proposedHeadersRange2.Cells.Cast<object>() .Select( (t, i) => ((Range)proposedHeadersRange2.Cells[i + 1]).Value2 ?? string.Empty) .Cast<string>() .ToList(); foreach (string s in proposedHeaders1.Where(s => !s.Equals(string.Empty))) { Console.WriteLine(s); } foreach (string s in proposedHeaders2.Where(s => !s.Equals(string.Empty))) { Console.WriteLine(s); } } catch (Exception e) { Console.WriteLine(e.Message); } finally { excel.Visible = true; wb.Close(false, null, null); excel.Quit(); } 

第一个问题:

C#string是否支持string中上标和下标的格式化特性?

第二个问题:

如果对第一个问题的答案是肯定的,我将如何去完成这个任务?

更新:带有上标格式的硬编码string的示例

在这里输入图像说明

您可以通过给定RangeFont Property中的逻辑标志从Excel获取上标/下标信息:

 Range curRange = ws.get_Range("A1"); if(curRange.Font.Superscript) { //It is a superscript } if(curRange.Font.Subscript) { //It is a subscript } 

在C#winforms中表示这个最简单的方法是依靠一个RichTextBox (甚至可以使它看起来像一个标签,如下面的链接中所build议的那样)和它的SelectionCharOffset 。 使用Labels ,它不是那么简单,但有一些解决方法 。

———-更新

对第一个问题的答复:

C#支持通过其Objects格式化,而不是其string typeExcel strings不支持格式化; Ranges是负责处理这个的。

对第二个问题的答复:

您可以在C#中复制Excel Cells / Ranges所依靠的相应C#等效项,即: Controls / Objects 。 用于文本修饰的ControlRichTextBox ,因此在这种情况下它是最好的等价物。 但是,如上所述,通过使用其他Controls来交付您想要的结果有不同的方法。