Excelreplace值,而不会丢失格式
我有一个使用Office自动化的Microsoft Excel(2003)自动化应用程序。 它所做的一件事就是取代价值观。 我得到的问题是,当更换值时,所有丰富的格式将丢失,如下所示: http : //support.microsoft.com/kb/177194
为了澄清,我用下面的单元格中的valueYreplacevalueX:
valueX是伟大的
这导致:
价值是伟大的
在更换之前 ,我尝试在单元格中获取格式,所以我可以保存哪些字符是粗体,并在replace值后应用格式。 但我找不到一种方法来获取每个字符的格式。 (C#)
有没有办法解决这个问题,而不使用上面的网站上给出的决议? 在C#中或Excel中的一些解决方法
在你的问题中,你提到你不知道如何获取C#中每个字符的格式,但是你可能能够在Excel中使用一个解决方法。 我不确定Excel中的哪些对象是通过interop暴露给C#的,但是也许我会告诉你在VBA中可以做些什么会有一些帮助。
我将提供三个部分给我的答案:
- 如何使用VBA在Excel中查找字符的格式。
- 重置被replace的单元格内容的格式的复杂性。
- 在Excel中使用VBA的前/后情况的一种可能的方法。
如何使用VBA在Excel中查找字符的格式
给定字符的格式通过Range.Characters.Font
对象公开。 让我们来看看。 想象一下,在Excel工作表Sheet1
的单元格A1
中有以下内容:
devise
您可以从示例中看到第3个和第4个字符是粗体。 我们怎样才能find这些字符的属性和其他字体属性? 这是一个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 Arial 0 10错误 2 e Arial 0 10错误 3 s Arial 0 10正确 4 t Arial 0 10正确 5我Arial 0 10假 6 n Arial 0 10错误
重置被replace的单元格内容的格式的复杂性
我想这个问题的棘手部分实际上并不在于find每个单独字符的格式(当然,假设在你的情况下它甚至是可能的)。 困难的部分将是“记住”每个字符的格式,并在replace文本后重新应用格式。
在最简单的情况下,您的replacestring总是与您的目标string长度相同。 如果valueX
将被valueY
取代,并且它的长度始终相同,则保留格式是相当容易的。 只需在运行replace方法之前获取格式,然后使用与之前完全相同的设置为每个字符重新应用格式。
稍微难一点的是,如果你正在取代一个单元格中的一个可能的值。 在这种情况下,您需要通过replacestring和目标string之间的长度差异来抵消replace格式,并且只能在replace后的string之后这样做。
在最丑陋的情况下,你有n个string将被replace,在这种情况下,当你通过字符分析应用格式化时,你必须为每个后续的replace做类似的n * difference
。
我相信这个任务有更好的algorithm,但也许最适合单独的SO问题。
在Excel中使用VBA的前/后情况的一种可能的方法
理想情况下,您将find一种直接从C#访问必要对象的方法,因此您不必处理VBA代码和Excel。 但是你可能不那么幸运。
如果您必须在Excel中进行格式设置,则可以采用以下方法之一。
- 将您的Excel工作表设置为3张:
Original
,Copy
,ReplacedValues
- 在运行C#代码之前,请确保
Copy
是Original
的重复。 - 当您运行C#代码来replace单元格内容时,请将replacestring的值粘贴到
ReplacedValues
工作表中。 我会推荐一些简单的地方,如你的范围地址(例如B2
)在列A中,原始值在列B中,replace值在列C中。 - 在运行C#代码之后,编写一个方法,它将遍历
ReplacedValues
列出的所有范围。 - 对于每个范围,您都可以在“
Copy
引用原始值(也许我的命名scheme有点令人困惑),并在“Original
引用更新后的值。 - find
Copy
的原始格式。 使用string长度的差异来抵消并将您的格式应用回原来的位置(这是您编写一些花哨的代码parsing器来完成所有这些工作的地方)。
可能比上述过程更好的方法,但我认为这将是相当不错的。