我需要一种更好的方法来近似 ASP 网络应用程序中的列表分隔符

I need a better way to approximate the List Separator in an ASP web app

我们在 Windows 服务器上托管我们的 Web 表单应用程序。

我们利用 SpreadSheetGear 将公式写入单元格并允许用户下载工作簿。

我们根据服务器文化确定列表分隔符(这是一个问题)。

我们为美国和拉丁美洲的客户提供服务。

所有这些加起来导致我们为拉丁美洲机器提供了错误的列表分隔符。服务器文化与用户文化不匹配,因此当我们尝试使用不正确的分隔符对单元格进行公式计算时,SpreadSheetGear 会抛出无效公式错误。

我找不到从本地机器获取分隔符的方法。 Accept-Language 在 HTTP header 上向我传递了多种具有加权值的语言,但这仍然是猜测。

我的解决方案是创建一个工作簿并尝试写入该新工作簿上的单元格。如果失败,则分隔符为逗号,否则为 semi-colon.

这个逻辑的问题是我们经常调用 ExcelValueSeparator,每次调用时,我们都会创建和处理新的工作簿、工作表等。我们关心的是速度。

我附上了我的新逻辑的屏幕截图。

这里有没有人有更好的方法来完成这个而不用猜测?我们对速度的担忧是否合理?

如果您完全控制服务器上的 workbook-creating 和 formula-creating 进程(即,您来自全球其他地区的 end-users 可能无法提供 culture-sensitive 函数或公式字符串),如果您的 end-user 从他们的浏览器接收可下载的 Excel 文件,例如 XLSX、XLSM 或 XLS,那么对我来说,您可以简化您的 server-side 的方法是确保您始终使用“en-US”CultureInfo 对象创建工作簿并在构建公式时遵守 en-US 约定(例如使用逗号作为列表分隔符)。

原因是 ListSeparator 等工作簿的这些 CultureInfo-specific 方面仅在运行时相关——当工作簿文件实际在 SpreadsheetGear 中打开时,或 Excel 就此而言。一旦工作簿存储在磁盘上(或发送到 end-user 的浏览器时以流形式存储),它实际上是以“locale-neutral”方式存储在该文件中的。直到随后在给定区域环境下打开文件(即,在 Excel 中,他们查看 OS 区域设置;在 SpreadsheetGear 中,我们查看您传入的 CultureInfo),locale-sensitive 列表分隔符(以及日期格式、货币字符等其他内容)动态应用于工作簿。

因此,对于您的拉丁美洲客户,Excel 工作簿在运行时在服务器上为“en-US”,将采用它们可能的任何区域设置约定 运行 在他们的机器上,一旦他们在 Excel.

中打开它

为了确保在 SpreadsheetGear 中处理文件时使用“en-US”(并保证您始终可以为 ListSeparator 使用逗号),您可以显式传递 CultureInfo,或者只是不要传递任何东西,因为这是默认使用的。示例:

// These are functionally the same.
IWorkbook workbook = Factory.GetWorkbook();
IWorkbook workbook = Factory.GetWorkbook(System.Globalization.CultureInfo.GetCultureInfo("en-US"));