Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Excel-OpenXml中更改CellValue中文本的字体颜色_C#_Excel_Openxml - Fatal编程技术网

C# 在Excel-OpenXml中更改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

如何在excel中更改CellValue的文本颜色?我可以更改单元格的前景色,但它会更改单元格内所有文本的颜色,这是我不想要的。我只想突出显示单元格内的特定文本,即单元格值文本

我使用下面的代码来突出显示单元格文本,如何为CellValue执行此操作

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 ...
                }
            }
        }
    }
}