【问题标题】:I need a better way to approximate the List Separator in an ASP web app我需要一种更好的方法来近似 ASP Web 应用程序中的列表分隔符
【发布时间】:2021-01-10 22:45:04
【问题描述】:

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: spreadsheetgear


    【解决方案1】:

    如果您可以完全控制服务器上的工作簿创建和公式创建过程(即,来自全球其他地区的最终用户不提供可能对文化敏感的函数或公式字符串),并且如果您的最终用户正在从他们的浏览器接收可下载的 Excel 文件,例如 XLSX、XLSM 或 XLS,那么在我看来,您可以通过确保始终使用“en-US”CultureInfo 创建工作簿来简化服务器端方法在构建公式时,对象并遵守 en-US 约定(例如使用逗号作为列表分隔符)。

    原因是工作簿的这些 CultureInfo 特定方面(例如 ListSeparator)仅在运行时相关 - 当工作簿文件实际在 SpreadsheetGear 或 Excel 中打开时。一旦工作簿存储在磁盘上(或发送到最终用户的浏览器时的流形式),它基本上以“区域设置中立”的方式存储在该文件中。直到文件随后在给定的区域环境下打开(即,在 Excel 中,他们查看操作系统区域设置;在 SpreadsheetGear 中,我们查看您传入的 CultureInfo),区域设置敏感的东西,如列表分隔符(和其他日期格式、货币字符等)动态应用于工作簿。

    因此,对于您的拉丁美洲客户,运行时服务器上“en-US”的 Excel 工作簿将采用他们在 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"));
    

    【讨论】:

    • 我需要做更多的测试,蒂姆,但我相信后者的代码是有效的。我已经成功地打印了它。当我没有向 GetWorkbook 传递任何内容时,我没有成功打印。还是失败了。我们在这里使用多个角度,所以在我标记之前我要确认一下。谢谢!
    • 我可以肯定地说,上面提到的 Factory.GetWorkbook() 的任何重载都将使用“en-US”。它记录在这里:spreadsheetgear.com/support/help/spreadsheetgear.net.8.0/… 我仔细检查了源代码以确保是这种情况(SpreadsheetGear 不是开源的,但我为 SpreadsheetGear 工作,因此可以检查它)。我无法解释为什么每种方法都可能导致您的应用程序以不同的方式运行,但这里肯定有其他原因。
    • “en-US”可能仍然失败的边缘情况是您的机器在区域设置中设置为“en-US”,但您在控制中自定义了“列表分隔符”字段面板对话框改​​为使用分号。在您传递的原始代码中 System.Globalization.CultureInfo.CurrentCulture 技术上是“en-US”;但是,SpreadsheetGear 会选择自定义分号。因此,在这种情况下,尝试在公式中使用逗号作为列表分隔符会失败。传入 GetCultureInfo("en-US") 或省略任何 CultureInfo 应该会给你一个普通的 en-US CultureInfo。
    • 另请注意,有一个 IWorkbook.WorkbookSet.Culture 属性返回用于工作簿集的 CultureInfo 对象。所以一旦你有了这个,你可以检查CultureInfo.TextInfo.ListSeparator 以明确知道SpreadsheetGear 需要什么列表分隔符。
    • 哈哈,我永远不会拒绝加薪 :) 不幸的是,我们没有 Slack 或 Discord 或类似的东西。但我确实在 SO 上积极监控 [spreadsheetgear] 标签,并尽我所能做出回应。 SpreadsheetGear 产品的活跃订阅者(或 30 天的评估者)也可以直接通过电子邮件/电话联系我们以获得技术支持。我们会在工作时间内尽最大努力尽快回复(肯定是当天,对于简单的查询,通常在一小时或几分钟内)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多