C# 在Excel-OpenXml中更改CellValue中文本的字体颜色
如何在excel中更改CellValue的文本颜色?我可以更改单元格的前景色,但它会更改单元格内所有文本的颜色,这是我不想要的。我只想突出显示单元格内的特定文本,即单元格值文本 我使用下面的代码来突出显示单元格文本,如何为CellValue执行此操作C# 在Excel-OpenXml中更改CellValue中文本的字体颜色,c#,excel,openxml,C#,Excel,Openxml,如何在excel中更改CellValue的文本颜色?我可以更改单元格的前景色,但它会更改单元格内所有文本的颜色,这是我不想要的。我只想突出显示单元格内的特定文本,即单元格值文本 我使用下面的代码来突出显示单元格文本,如何为CellValue执行此操作 foreach (DocumentFormat.OpenXml.Spreadsheet.Cell currentCell in allCells) { Fill fill = new Fill() { Patter
foreach (DocumentFormat.OpenXml.Spreadsheet.Cell currentCell in allCells)
{
Fill fill = new Fill()
{
PatternFill = new PatternFill
{
PatternType = PatternValues.Solid,
ForegroundColor = new ForegroundColor() { Rgb = "FFFF00" }
}
};
styleSheet.Fills.AppendChild(fill);
//Adding the CellFormat which uses the Fill element
CellFormats cellFormats = styleSheet.CellFormats;
CellFormat cf = new CellFormat();
cf.FillId = styleSheet.Fills.Count;
cellFormats.AppendChild(cf);
currentCell.StyleIndex = styleSheet.CellFormats.Count;
}
我在CellValue中看不到任何风格属性
CellValue currentCellValue = currentCell.GetFirstChild<CellValue>();
if (currentCell.DataType == CellValues.SharedString) // cell has a cell value that is a string, thus, stored else where
{
data = doc.WorkbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault().SharedStringTable.ElementAt(int.Parse(currentCellValue.Text)).InnerText;
}
您必须通过
SharedStringItem
元素进行操作。这样的
SharedStringItem
可以包含运行元素。
您可以在此运行元素上应用样式
代码还应涵盖SharedStringItem
不包含任何Run
子元素的情况,这一点很重要。
当单元格只包含文本,没有任何格式化的子元素时,就会出现这种情况。
在这里,您必须创建一个新梯段才能应用样式
下面的代码使用下图所示的Excel文件将第一行中的单元格的红色设置为红色。
单元格A1
包含Run
元素,单元格B1
不包含元素
最终结果看起来像
下图显示了之前和之后
编辑
回应您关于如何循环Excel文档中所有单元格的评论;请参阅下面的代码
String pathToYourExcelFile = @"C:\Folder\ExcelFile.xlsx";
using (SpreadsheetDocument document = SpreadsheetDocument.Open(pathToYourExcelFile, true))
{
WorkbookPart workbook = document.WorkbookPart;
// Loop over all worksheets.
IEnumerable<WorksheetPart> worksheets = document.WorkbookPart.WorksheetParts;
foreach (WorksheetPart worksheet in worksheets)
{
// Loop over all rows.
IEnumerable<Row> rows = worksheet.Worksheet.GetFirstChild<SheetData>().Elements<Row>();
foreach (Row row in rows)
{
// Loop over all cells.
foreach (Cell cell in row.Elements<Cell>())
{
// Loop over all cell values.
foreach (CellValue cellValue in cell.Elements<CellValue>())
{
// Apply content formatting as in code above ...
}
}
}
}
}
String pathToYourExcelFile=@“C:\Folder\ExcelFile.xlsx”;
使用(SpreadsheetDocument=SpreadsheetDocument.Open(路径到ExcelFile,true))
{
WorkbookPart工作簿=document.WorkbookPart;
//循环浏览所有工作表。
IEnumerable worksheets=document.WorkbookPart.WorksheetParts;
foreach(工作表部分工作表)
{
//在所有行上循环。
IEnumerable rows=worksheet.worksheet.GetFirstChild().Elements();
foreach(行中的行)
{
//在所有单元格上循环。
foreach(row.Elements()中的单元格)
{
//循环所有单元格值。
foreach(cell.Elements()中的CellValue CellValue)
{
//按照上面的代码应用内容格式。。。
}
}
}
}
}
我的标准评论。在Excel中打开新工作表。将文本放入单元格。保存工作表。按所需方式更改颜色,并将结果保存到其他文件中。现在从Microsoft站点下载OpenXML生产力工具。打开工具。选择比较文件(我想就是这样,这是一个按钮)并打开两个文件。您需要做的事情应该会让您大吃一惊。@Flygog57:此工具仅在我们创建新的电子表格时提供帮助。我的问题是我有现有的电子表格,我想从那里阅读并进行上述更改。你能帮我做同样的事情吗?我不知道如何使用我的Excel中的Run属性读取单元格值。如果创建两个电子表格,一个是原始电子表格,另一个是要更改的电子表格,然后进行区分,您可以找到差异。一旦你做到了这一点,你就会知道事情应该是什么样子。我猜“运行”是指一个单元格中有多个“运行”吗?如果您研究Word的格式是如何工作的,您可以发现什么是“运行”。文本的运行就像HTML
,它是具有相同属性的文本。一段文字可以由多段组成。我从来没有在OpenXml Excel中进行过任何奇特的格式设置,就我所知,以粗体显示列标题问题在于单词层次结构类似于段落->运行->文本,但电子表格中没有段落,所以我无法从运行中读取,我在Word中也做过同样的格式化,但工作正常,但电子表格给我带来了困难…我想更改单元格内文本的颜色,我可以在excel中更改单元格颜色,但我不想,我想更改单元格内特定文本的颜色,而不是整个单元格…所以,我只是打开excel,在单元格中键入一些文本,并改变了中间三个字的颜色。所以这是可能的。要想知道如何做到这一点,唯一的方法是保存一个带有该更改的Excel xlsx文件,并查看它是如何实现的。我不能这样做-我不能在我的工作电脑上安装随机工具。你的代码正常工作,唯一的问题是我的电子表格不会有任何颜色,就像你最初的绿色一样,这会将其分解为运行。对我来说,值将是“Microsoft很棒”,我将有需要突出显示的Microsoft文本。这是如何实现的?好的,我将看一看,你们的代码只适用于第一行,它是如何扩展到所有行和所有工作表的。谢谢。他们还有其他更好的方法来代替拆分单独的单词吗?通过一些String
操作;通过IndexOf
只查找要突出显示的单词,并通过Substring
等只获取您需要的部分。我没有理解您的意思,与您在上面建议的使用字符串数组部分右键断开的内容相同。您是指其他内容吗?你能提供一些示例代码吗?你想说什么?
String pathToYourExcelFile = @"C:\Folder\ExcelFile.xlsx";
using (SpreadsheetDocument document = SpreadsheetDocument.Open(pathToYourExcelFile, true))
{
WorkbookPart workbook = document.WorkbookPart;
WorksheetPart firstWorksheet = document.WorkbookPart.WorksheetParts.FirstOrDefault();
SharedStringTablePart stringTable = workbook.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
IEnumerable<Row> rows = firstWorksheet.Worksheet.GetFirstChild<SheetData>().Elements<Row>();
Row firstRow = rows.FirstOrDefault();
foreach (Cell cell in firstRow.Elements<Cell>())
{
foreach (CellValue cellValue in cell.Elements<CellValue>())
{
IEnumerable<SharedStringItem> sharedStrings =
stringTable.SharedStringTable.Elements<SharedStringItem>()
.Where((o, i) => i == Convert.ToInt32(cellValue.InnerText));
foreach (SharedStringItem sharedString in sharedStrings)
{
IEnumerable<Run> runs = sharedString.Elements<Run>();
if (runs.Count() > 0)
{
foreach (Run run in runs)
{
if (run.InnerText == "RED")
{
RunProperties properties = run.RunProperties ?? new RunProperties();
Color color = properties.Elements<Color>().FirstOrDefault();
if (color != null)
{
properties.RemoveChild<Color>(color);
}
properties.Append(new Color { Rgb = "FFFF0000" }) ;
}
}
}
else
{
// No Runs, only text; create a Run.
Text text = new Text(sharedString.InnerText);
sharedString.RemoveAllChildren();
Run run = new Run();
run.Append(text);
run.RunProperties = new RunProperties();
run.RunProperties.Append(new Color { Rgb = "FFFF0000" }) ;
sharedString.Append(run);
}
}
}
}
document.Save();
// No Runs, only text.
const String MS = "Microsoft";
String innerText = sharedString.InnerText;
if (innerText.IndexOf(MS, StringComparison.OrdinalIgnoreCase) >= 0)
{
sharedString.RemoveAllChildren();
String[] parts = innerText.Split(' ');
for (Int32 i = 0; i < parts.Length; i++)
{
String part = parts[i];
Text text = new Text((i > 0 ? " " : String.Empty) + part);
text.Space = SpaceProcessingModeValues.Preserve;
Run run = new Run();
run.Append(text);
if (part.Equals(MS, StringComparison.OrdinalIgnoreCase))
{
run.RunProperties = new RunProperties();
run.RunProperties.Append(new Color { Rgb = "FFFF0000" }) ;
}
sharedString.Append(run);
}
String pathToYourExcelFile = @"C:\Folder\ExcelFile.xlsx";
using (SpreadsheetDocument document = SpreadsheetDocument.Open(pathToYourExcelFile, true))
{
WorkbookPart workbook = document.WorkbookPart;
// Loop over all worksheets.
IEnumerable<WorksheetPart> worksheets = document.WorkbookPart.WorksheetParts;
foreach (WorksheetPart worksheet in worksheets)
{
// Loop over all rows.
IEnumerable<Row> rows = worksheet.Worksheet.GetFirstChild<SheetData>().Elements<Row>();
foreach (Row row in rows)
{
// Loop over all cells.
foreach (Cell cell in row.Elements<Cell>())
{
// Loop over all cell values.
foreach (CellValue cellValue in cell.Elements<CellValue>())
{
// Apply content formatting as in code above ...
}
}
}
}
}