Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在自动化不同本地化版本的Excel时如何正确设置NumberFormat属性

在自动化不同本地化版本的Excel时如何正确设置NumberFormat属性
EN

Stack Overflow用户
提问于 2012-06-08 03:11:36
回答 3查看 20.3K关注 0票数 4

我遇到了以下问题:

当从我的Delphi程序中通过OLE自动化Excel并试图设置单元格的NumberFormat属性时,Excel期望格式字符串是本地化格式。

通常,通过在Excel中记录宏来检查格式时,Excel的预期如下:单元格(1,2).NumberFormat = "#,##0.00“

这意味着数千个分隔符是",“而十进制分隔符是”。

实际上,我使用的是Excel的本地化版本。在我的区域设置中,数千个分隔符是“",而十进制分隔符是”,“。

因此,每当从我的Delphi程序中设置NumberFormat时,我都需要像"# ##0,00“那样指定它。

我的问题是:显然,如果我在我的程序中硬编码这些值,那么当我的程序与英语或另一个不同本地化版本的一起使用时,就会有一个例外。是否有一种“通用”方法来设置NumberFormat属性?(使用默认的英语区域设置?)

谢谢!

Update:,我在这个页面上找到了一种更优雅的方法:http://www.delphikingdom.com/asp/viewitem.asp?catalogid=920&mode=print,它是俄语的(我也不会说),但是您可以很容易地理解代码。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-08 03:46:07

在Excel中有两个字段:

  • NumberFormatLocal

  • NumberFormat NumberFormat

NumberFormat采用美国标准中始终不变的格式,而NumberFormatLocal期望格式具有设置的区域设置。

例如

代码语言:javascript
运行
AI代码解释
复制
Sub test()
    Dim r As Range
    Set r = ActiveWorkbook.ActiveSheet.Range("$A$1")
    r.NumberFormat = "#,##0.00"
    Set r = ActiveWorkbook.ActiveSheet.Range("$A$2")
    r.NumberFormat = "#.##0,00"
    Set r = ActiveWorkbook.ActiveSheet.Range("$A$3")
    r.NumberFormatLocal = "#,##0.00"
    Set r = ActiveWorkbook.ActiveSheet.Range("$A$4")
    r.NumberFormatLocal = "#.##0,00"       
End Sub

与德语设置(十进制9月:,和千9月:.)为$A$1和$A$4提供正确的格式化数字。如果您将窗口中的区域设置更改为您喜欢的任何内容,然后尝试,如果您的格式有效,您可以测试它。

假设您使用Delphi5并拥有像这样启动Excel的代码(并且可以访问ComObj.pas):

代码语言:javascript
运行
AI代码解释
复制
var
  oXL, oWB, oSheet : Variant;
 LocaleId : Integer;
begin
 oXL := CreateOleObject('Excel.Application');
 oXL.Visible := True;
 oWB := oXL.Workbooks.Add;
 oSheet := oWB.ActiveSheet;
 oSheet.Range['$A$1'].NumberFormatLocal := '#.##0,00';
 oSheet.Range['$A$2'].NumberFormatLocal := '#,##0.00';
 LocaleID:= DispCallLocaleID($0409);
 try
    oSheet.Range['$A$3'].NumberFormat := '#.##0,00';
    oSheet.Range['$A$4'].NumberFormat := '#,##0.00';
 finally
    DispCallLocaleId( LocaleId);
 end;
end;

然后默认情况下,每个调用都经过ComObj.VarDispInvoke,后者调用ComObj.DispatchInvoke。在这里,您可以找到对Dispatch.Invoke的调用,它将作为第三个参数获得lcid。这被设置为0。您可以使用注释中第一个链接中显示的技术来创建自己的单元,并将所有代码从ComObj复制到自己的单元(或直接修改ComObj )。只是不要忘记在单元的初始化中设置VarDispProc变量。最后一部分似乎并非在所有情况下都起作用(可能取决于模块的顺序),但您可以在代码中设置变量:

代码语言:javascript
运行
AI代码解释
复制
 VarDispProc := @VarDispInvoke;

必须将VarDispInvoke放置到ComObj复制模块的接口部分。第一个链接的代码不直接工作,因为它修改了一个不同的方法,在上面的Delphi示例中没有调用这个方法。

改变数字格式调用的区域设置就足够了(以避免副作用)。

上面的例子和所描述的修改为我的德语excel正确工作。如果没有修改或对DispCallLocaleId的调用,我就会看到与您描述的问题相同的问题。

票数 4
EN

Stack Overflow用户

发布于 2018-04-12 00:00:35

您可以让excel管理此选项,以避免其他系统中的差异:

代码语言:javascript
运行
AI代码解释
复制
.....NumberFormat :='#'+Excel.ThousandsSeparator+'##0'+Excel.DecimalSeparator+'00';
票数 0
EN

Stack Overflow用户

发布于 2018-08-08 05:15:59

还可以直接设置属性值。

代码语言:javascript
运行
AI代码解释
复制
 SetDispatchPropValue(oSheet, 
     'Range['$A$1'].NumberFormatLocal',$0409);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10947727

复制
相关文章
Java泛型,你了解类型擦除吗?
大家可能会有疑问,我为什么叫做泛型是一个守门者。这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可测,它并不神秘与神奇。泛型是 Java 中一个很小巧的概念,但同时也是一个很容易让人迷惑的知识点,它让人迷惑的地方在于它的许多表现有点违反直觉。
Java团长
2018/08/03
2.3K0
Java泛型之类型擦除类型擦除参考资料
学过C++模板的,在使用Java泛型的时候,会感觉到有点不疑问,例如:(1)无法定义一个泛型数组、无法调用泛型参数对象中对应的方法(当然,通过extends关键字是可以做到,只是比较麻烦);(2)ArrayList<Integer>和ArrayList<String>在运行时的类型是相同的。Java中的泛型有这些问题,是它的实现机制决定的,即“类型擦除”。
阿杜
2018/08/06
6280
Java泛型类型擦除问题
以前就了解过Java泛型的实现是不完整的,最近在做一些代码重构的时候遇到一些Java泛型类型擦除的问题,简单的来说,Java泛型中所指定的类型在编译时会将其去除,因此List<String> 和 List 在编译成字节码的时候实际上是一样的。因此java泛型只能做到编译期检查的功能,运行期间就不能保证类型安全。我最近遇到的一个问题如下:
用户7353950
2022/06/23
1.2K0
JAVA泛型与类型擦除
为什么要用T而不是其它字母?事实上是可以任意字符串(如Result< something >),但是为了显得专业,一般约定几个大写字母在不同场景使用。
acupt
2019/08/26
1.8K0
转:Java 泛型,你了解类型擦除吗?
大家可能会有疑问,我为什么叫做泛型是一个守门者。这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可测,它并不神秘与神奇。泛型是 Java 中一个很小巧的概念,但同时也是一个很容易让人迷惑的知识点,它让人迷惑的地方在于它的许多表现有点违反直觉。
剑影啸清寒
2019/05/26
1.4K0
带你深挖Java泛型类型擦除以及类型擦除带来的问题
大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。
Bug开发工程师
2020/02/13
3.9K1
带你深挖Java泛型类型擦除以及类型擦除带来的问题
带你深挖Java泛型类型擦除以及类型擦除带来的问题
大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。
业余草
2020/02/13
1.8K0
Kotlin 泛型之类型擦除
Kotlin 基于 Java 6,因此 Kotlin 天生支持泛型。但是 Kotlin 的泛型有自己的特点。
fengzhizi715
2019/06/11
1.8K0
Java 泛型擦除_泛型和泛型擦除
如果仅凭直觉来看,该程序可能会输出 false 这个结果,但在具体的环境下运行时会输出 true 。这很令人费解,这是为什么呢?
全栈程序员站长
2022/11/01
2.5K0
揭开Java 泛型类型擦除神秘面纱
大家可能会有疑问,我为什么叫做泛型是一个守门者。这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可测,它并不神秘与神奇。泛型是 Java 中一个很小巧的概念,但同时也是一个很容易让人迷惑的知识点,它让人迷惑的地方在于它的许多表现有点违反直觉。
Java技术栈
2018/09/29
9810
揭开Java 泛型类型擦除神秘面纱
大家可能会有疑问,我为什么叫做泛型是一个守门者。这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可测,它并不神秘与神奇。泛型是 Java 中一个很小巧的概念,但同时也是一个很容易让人迷惑的知识点,它让人迷惑的地方在于它的许多表现有点违反直觉。
java思维导图
2018/10/24
1.3K0
揭开Java 泛型类型擦除神秘面纱
揭开Java 泛型类型擦除神秘面纱
大家可能会有疑问,我为什么叫做泛型是一个守门者。这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可测,它并不神秘与神奇。泛型是 Java 中一个很小巧的概念,但同时也是一个很容易让人迷惑的知识点,它让人迷惑的地方在于它的许多表现有点违反直觉。
用户1257393
2018/10/26
1.1K0
Java基础篇:泛型与类型擦除
泛型的本质是 参数化类型,也就是说 将所操作的数据类型 指定为一个参数,在不创建新类的情况下,通过参数来指定所要操作的具体类型(类似于方法中的变量参数,此时类型也定义成参数形式),也就是说,在创建对象或者调用方法的时候才明确下具体的类型。可以在类、接口、方法中使用,分别称为泛型类、泛型接口、泛型方法。
全栈程序员站长
2021/12/23
1.2K0
Java基础篇:泛型与类型擦除
【进阶之路】Java的类型擦除式泛型
Java选择的泛型类型叫做类型擦除式泛型。什么是类型擦除式泛型呢?就是Java语言中的泛型只存在于程序源码之中,在编译后的字节码文件里,则全部泛型都会被替换为原来的原始类型(Raw Type),并且会在相应的地方插入强制转型的代码。
南橘
2022/03/07
1.2K0
【进阶之路】Java的类型擦除式泛型
Java语法糖之泛型与类型擦除
泛型,JDK 1.5新特性,本质是参数化类型(Parametersized Type) 的应用,即所操作的数据类型被指定为一个参数。这种参数类型可用在:
JavaEdge
2021/12/07
5840
Java语法糖之泛型与类型擦除
Java语法糖之泛型与类型擦除
泛型,JDK 1.5新特性,本质是参数化类型(Parametersized Type) 的应用,即所操作的数据类型被指定为一个参数。这种参数类型可用在:
JavaEdge
2018/05/16
1.1K0
Java语法糖之泛型与类型擦除
Java泛型擦除
语法糖只不过是一种程序的表达式,语法糖可以提高程序的可读性,语法糖经过编译后,将会恢复原来的样貌。
shysh95
2021/03/16
7700
Java泛型擦除
【说站】java泛型中类型擦除的转换
2、这个特征被称为类型删除。当泛型被删除时,他有两种转换方法。第一种是,如果泛型没有设置类型上限,泛型将转换为Object类型,第二种是如果设置了类型上限,泛型将转换为其类型上限。
很酷的站长
2022/11/23
1.3K0
【说站】java泛型中类型擦除的转换
泛型(泛型擦除)【java基础—-泛型】
Java泛型是J2 SE1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter),这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
全栈程序员站长
2022/11/02
2.9K0
泛型(泛型擦除)【java基础—-泛型】
初探Java类型擦除
本篇博客主要介绍了Java类型擦除的定义,详细的介绍了类型擦除在Java中所出现的场景。
SH的全栈笔记
2019/10/20
8990

相似问题

Java泛型类型擦除?

40

java泛型类型擦除

21

Java泛型类型擦除

11

Java泛型的类型擦除会导致全类型铸造吗?

44

Java泛型和类型擦除

51
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档