在您的问题中,您提到您无法弄清楚如何在 C# 中获取每个字符的格式,但您可能可以在 Excel 中使用解决方法。我不确定 Excel 中的哪些对象通过互操作暴露给 C#,但也许我向您展示可以在 VBA 中完成的操作会有所帮助。
我将提供三个部分来回答我的问题:
- 如何使用 VBA 在 Excel 中查找字符格式。
- 重置被替换单元格内容格式的复杂性。
- 在之前/之后的情况下在 Excel 中使用 VBA 的一种可能方法。
如何使用 VBA 在 Excel 中查找字符格式
给定字符的格式通过Range.Characters.Font
对象公开。让我们来看看。想象一下,您在Excel 工作表的单元格A1
中有以下内容:Sheet1
测试_ _
从示例中可以看出,第 3 和第 4 个字符是粗体。我们如何找到这些字符的这些属性和其他字体属性?这是一个 VBA 函数,它演示了您可以通过Range.Characters
和公开的一些属性Range.Characters.Font
:
Sub IterateCharacters()
Dim rng As Range
Dim lngLen As Long
Dim lngCount As Long
Dim chr As Characters
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")
lngCount = 1
lngLen = Len(rng.Value)
Debug.Print "Count", "Text", "Font", "Color", "Size", "Bold"
Do While lngCount <= lngLen
Set chr = rng.Characters(lngCount, 1)
Debug.Print lngCount, chr.Text, chr.Font.Name, chr.Font.Color, chr.Font.Size, chr.Font.Bold
lngCount = lngCount + 1
Loop
End Sub
上面的代码将产生以下输出:
计数文本字体颜色大小粗体
1 T 宋体 0 10 假
2 e 宋体 0 10 假
3 秒 Arial 0 10 真
4 t 宋体 0 10 真
5 i 宋体 0 10 假
6 n 宋体 0 10 假
重置被替换单元格内容格式的复杂性
我想这个问题的棘手部分实际上并不在于找到每个单独字符的格式(当然,假设在你的情况下它甚至是可能的)。困难的部分将是“记住”每个字符的格式并在替换文本后重新应用格式。
在最简单的情况下,您的替换字符串始终与您的目标字符串具有相同的长度。如果valueX
将简单地替换为valueY
,并且长度始终相同,则保留格式非常容易。只需在运行替换方法之前获取格式,然后使用与之前完全相同的设置重新应用每个字符的格式。
如果您要替换单元格中的一个可能值,则稍微困难一些。在这种情况下,您需要通过替换字符串和目标字符串之间的长度差异来抵消替换格式,并且仅在替换字符串之后这样做。
在最丑陋的情况下,您有 n 个将被替换的字符串,在这种情况下,当您解析回字符以应用格式时,您必须n * difference
对每个后续替换进行类似的操作。
我确信这项任务有更好的算法,但也许这最适合单独的 SO 问题。
在之前/之后的情况下在 Excel 中使用 VBA 的一种可能方法
理想情况下,您会找到一种直接从 C# 访问必要对象的方法,这样您就不必处理 VBA 代码和 Excel。但你可能没有那么幸运。
如果您必须在 Excel 中进行格式设置,您可以使用以下方法。
- 将您的 Excel 工作表设置为 3 个工作表:
Original
、、、Copy
ReplacedValues
- 在运行 C# 代码之前,请确保它
Copy
是Original
.
- 运行 C# 代码替换单元格内容时,将替换字符串的值粘贴到
ReplacedValues
工作表中。我会推荐一些简单的东西,您的范围地址(例如B2
)在 A 列中,原始值在 B 列中,替换值在 C 列中。
- 运行 C# 代码后,编写一个方法来遍历
ReplacedValues
.
- 对于每个范围,您将能够引用 中的原始值
Copy
(也许我的命名方案有点混乱)和Original
.
- 查找原始格式在
Copy
. 使用字符串长度的差异来抵消并将您的格式应用回原始格式(这是您可以编写一些花哨的代码解析器来完成所有这些工作的地方)。
可能有比上述过程更好的方法,但我认为这会很好。