NPOI 数据格式

2024-01-12

我正在使用 NPOI v1.2.3 导出网格,但在使单元格格式正常工作时遇到问题。

我有一个类将对象列表导出到 XLS 文件。为每个对象创建一行,并为每个配置的属性添加一个单元格。可以在每个属性级别设置单元格数据格式。

我读过您不应该为每个单元格创建新样式 https://stackoverflow.com/questions/3425931/npoi-excel-number-format-not-showing-in-excel-sheet-in-asp-net。我无法对我的样式进行硬编码,因为我的导出器需要支持任何类。相反,我编写了一个小型缓存系统,如果尚未为当前单元格的格式创建新的 CellStyle,则该系统仅创建新的 CellStyle。

不幸的是,这仍然没有解决问题。最终 XLS 文件中的格式未正确应用。在我的测试用例中,XLS 中的大多数单元格都使用“日期”格式,即使只有几列是日期。但是,第一列正确地使用了自定义格式。没有单元格被设置为文本,尽管这应该是大多数单元格。

我究竟做错了什么?

Code

下面的“AddRecords”方法用于添加数据行(页眉和页脚行分别添加)。最后一段代码是延迟加载 CellStyles 的方法。

private void AddRecords( Sheet sheet, IList<T> records )
{
    foreach( var record in records )
    {
        // append row
        var row = sheet.CreateRow ( sheet.LastRowNum + 1 );

        // iterate through all configured columns
        foreach ( var column in GetColumns() )
        {
            // append cell
            Cell cell = row.CreateCell ( row.LastCellNum == -1 ? 0 : row.LastCellNum );

            // get the property value of the column from the record
            object value = GetCellValue ( column, record );

            // extension method that takes an object value and calls the appropriate type-specific SetCellValue overload
            cell.SetCellValue ( value );

            // get format from the column definition ("m/d", "##.###", etc.), or use the default
            string dataFormat = column.DataFormat ?? GetDefaultDataFormat ( value );

            // find/create cell style
            cell.CellStyle = GetCellStyleForFormat( sheet.Workbook, dataFormat );
        }
    }
}

/// <summary>
/// Returns a default format string based on the object type of value.
///
/// http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/BuiltinFormats.html
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private string GetDefaultDataFormat( object value )
{
    if( value == null )
    {
        return "General";
    }

    if( value is DateTime )
    {
        return "m/d";
    }

    if( value is bool )
    {
        return "[=0]\"Yes\";[=1]\"No\"";
    }

    if( value is byte || value is ushort || value is short ||
         value is uint || value is int || value is ulong || value is long )
    {
        return "0";
    }

    if( value is float || value is double )
    {
        return "0.00";
    }

    // strings and anything else should be text
    return "text";
}

private readonly Dictionary<string, CellStyle> _cellStyleCache = new Dictionary < string, CellStyle > ();

private CellStyle GetCellStyleForFormat( Workbook workbook, string dataFormat )
{
    if( !_cellStyleCache.ContainsKey ( dataFormat ) )
    {
        var newDataFormat = workbook.CreateDataFormat ();
        var style = workbook.CreateCellStyle ();
        style.DataFormat = newDataFormat.GetFormat ( dataFormat );

        _cellStyleCache[dataFormat] = style;
    }

    return _cellStyleCache[dataFormat];
}

看起来问题与创建与内置格式匹配的新格式有关。我将延迟加载方法更改为使用内置格式(如果可用),并且最终 XLS 中的单元格格式现在全部正确。

if( !_cellStyleCache.ContainsKey ( dataFormat ) )
{
    var style = workbook.CreateCellStyle ();

    // check if this is a built-in format
    var builtinFormatId = HSSFDataFormat.GetBuiltinFormat ( dataFormat );

    if( builtinFormatId != - 1)
    {
        style.DataFormat = builtinFormatId;
    }
    else
    {
        // not a built-in format, so create a new one
        var newDataFormat = workbook.CreateDataFormat ();
        style.DataFormat = newDataFormat.GetFormat ( dataFormat );
    }

    _cellStyleCache[dataFormat] = style;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NPOI 数据格式 的相关文章

  • 使用 TCP 套接字在本地代理视频

    我一直对向媒体浏览器添加对视频播客的支持非常感兴趣 我希望用户能够浏览可用的视频播客并从互联网上流式传输它们 这真的很容易 因为媒体播放器等将愉快地播放存在于云中的文件 问题是我想在本地缓存这些文件 因此同一集的后续观看将不涉及流式传输 而
  • 为什么在 lambda 内部引发异常是 C# 7 的一项功能? [复制]

    这个问题在这里已经有答案了 该语句在 VS2015 中无法编译 但在 VS2017 中可以编译 var example new Action gt throw new Exception 为了支持在 lambda 表达式内抛出异常 必须对
  • 为什么我应该使用内联代码? [复制]

    这个问题在这里已经有答案了 我是一名 C C 开发人员 这里有几个始终困扰我的问题 常规 代码和内联代码之间有很大区别吗 主要区别是什么 内联代码只是宏的一种 形式 吗 选择内联代码时必须进行什么样的权衡 Thanks 表现 正如之前的答案
  • 如何创建语法突出显示文本框[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何使用 C Net 创建语法突出显示文本框 Take 闪烁网 http scintillanet codeplex com 并采取其
  • C++:字符串流有什么好处?

    谁能告诉我一些在 C 中使用字符串流的实际例子 即使用流插入和流提取运算符输入和输出到字符串流 您可以使用字符串流来转换任何实现operator lt lt 到一个字符串 include
  • C 中的 '\0' 和 printf()

    在 C 入门课程中 我了解到在存储字符串时存储空字符 0在它的最后 但是如果我想打印一个字符串怎么办 printf hello 虽然我发现它并没有结束 0通过以下声明 printf d printf hello Output 5 但这似乎不
  • 带有嵌入 Flash 视频的 PDF 示例?

    有谁知道我在哪里可以查看嵌入 Flash 视频的 PDF 示例 我知道问这个问题很愚蠢 因为你会认为任何面向技术的用户都应该能够使用谷歌找到一个 但我真的找不到 我的另一个问题是 使用 C 中的 API 将 Flash 视频嵌入 PDF 文
  • 析构函数与成员函数竞赛

    当我在析构函数内时 其他线程是否可能开始执行对象的成员函数 遇到这种情况该如何处理呢 C 没有内在的保护来防止在删除对象后使用它 忘记竞争条件 另一个线程可以在完全删除你的对象后使用你的对象 Either 确保只有一个位置 代码拥有该对象
  • 将视频上传/保存到数据库或文件系统

    我以前从未尝试过保存视频 所以我对此了解不多 我知道如果视频很小 我可以转换为字节数组并保存到数据库 但是为了提高效率 我想了解如何将任何上传的视频保存到我的服务器文件中 然后只保存该文件的文件路径我的数据库表中的视频 我完全不知道如何开始
  • 如何在Unity Inspector中创建多维数组?

    如何在 Unity Inspector 中创建枚举多维数组并使其可序列化 以便我可以从不同的脚本调用它 public enum colors red blue green yellow cyan white purple public in
  • Web浏览器控件:如何捕获文档事件?

    我正在使用 WPF 的 WebBrowser 控件加载一个简单的网页 在这个页面上我有一个锚点或一个按钮 我想在我的应用程序后面的代码中 即在 C 中 捕获该按钮的单击事件 WebBrowser 控件是否有办法捕获加载页面元素上的单击事件
  • 可以通过模板间接访问基类中的私有类型

    我试图在编译时根据类型是否在给定范围内公开可用来选择要使用的类型 最好直接看代码 include
  • 使用左连接获得不适当的输出

    我正在尝试获取变体列表 并且对于每个变体都获取所有subvariants list无论子变体属于何处 特别的Test say 100 这是示例数据 Id TestId SourceSubVariantId TargetSubVariantI
  • ef core 在更新数据库期间不使用 ASPNETCORE_ENVIRONMENT

    我使用 Visual Studio 通过一定的迁移来更新我的所有环境 使用下面的命令效果很好 update database Migration initMigrationProduct c ProductContext Environme
  • 从 AuthorizeAttribute 继承的属性不起作用

    我目前正在尝试根据用户角色在新的 ASP MVC 5 应用程序中实现安全性 目标是防止用户在没有特定角色 或更高角色 的情况下访问某些控制器或控制器方法 根据到目前为止我所读到的问题 我创建了一个继承 AuthorizeAttribute
  • 如何解决 boost::multi precision::cpp_dec_float 除法错误

    除以boost multiprecision cpp dec float有某种舍入误差 如下 include
  • C中使用JNI从对象获取对象

    public class Student private People people private Result result private int amount 这是 Java 中类的示例 在C中 我试图获取 学生 中的 人 但失败了
  • 使用 DataGridViewCheckboxCell 真正禁用 DataGridView 中的复选框

    有谁知道如何使用 DataGridViewCheckboxCell 禁用 DataGridView 中的复选框 我可以将其设置为只读 并设置背景颜色 但我无法让复选框本身显示为禁用状态 有什么想法吗 Guess 你必须自己画 http so
  • 如何从 C# 中的 Web Api 方法正确获取字节数组?

    我有以下控制器方法 HttpPost Route SomeRoute public byte MyMethod FromBody string ID byte mybytearray db getmybytearray ID working
  • 从其对象获取结构体字段的名称和类型

    例如 我有一个类似这样的结构 struct Test int i float f char ch 10 我有一个该结构的对象 例如 Test obj 现在 我想以编程方式获取字段名称和类型obj 是否可以 顺便说一句 这是 C 你正在要求C

随机推荐

  • SQL Server - 是否有一种排序规则可以提供数字的自然顺序?

    我正在使用 SQL Server 2008 我有一个带有 type 列的表VarChar 它当前填充了实际代表数字的字符串 不幸的是 该列必须保留VarChar 1 2 1000 我希望查询该字段的最大数值 但由于这是一个VarChar我得
  • 使用属性过滤 Django-sphinx 结果?

    我正在经历 django sphinx文档 http code google com p django sphinx 看起来它允许您使用过滤搜索结果属性 queryset MyModel search query query results
  • Spring boot数据jpa多个数据源entityManagerFactory错误

    我想在 Spring Boot 中使用两个数据库 这里是代码 第一个数据库配置 Configuration EnableAutoConfiguration EnableJpaRepositories basePackages net ely
  • php echo 输出顺序变化

    希望这是一个简单的修复 出于某种原因 当我运行它时 我正在运行 WordPress 并使用高级自定义字段插件 echo Tickets Start at CA the field price 我得到这个输出 50Tickets Start
  • Caffe 中的批处理模式 - 没有性能提升

    继这个线程 https stackoverflow com q 32504394 1103412我重新实现了图像处理代码 以便一次发送 10 张图像 即我现在将输入 blob 的 num 属性设置为 100 而不是 10 然而 处理这批货所
  • Pandas:如果关键字出现在任何列中,则选择行

    我知道有一个关于在一列中搜索字符串的相关线程 here https stackoverflow com questions 27975069 how to filter rows containing a string pattern fr
  • Tensorflow:无法创建会话

    当我运行我的代码时出现错误 错误是 tensorflow python framework errors impl InternalError 无法创建会话 这是我的代码 coding utf 8 import import checkpo
  • 如何放松到 SwiftUI 中的 MainView

    我找不到从 ViewB 转到 ContentView 而不显示第二个的方法NavigationView在另一个之上NavigationView struct ContentView View var body some View Navig
  • 数据表中的 masterCheckbox

    我正在尝试将 masterCheckbox 添加到 webix 数据表项目中 现在 我得到以下行为 当我单击主复选框时 值重写为 1 或 0 id title checkValue on uncheckValue off template
  • 如何在 Node Express 应用程序中传递对象?

    我正在使用express和node postgres构建一个节点应用程序 https github com brianc node postgres https github com brianc node postgres 我只想构建一次
  • 如何使用订阅者选项?

    我现在开始使用 Pubsubhubbub 以及所有关于实时的东西 但我在使用订阅者选项时遇到了问题 我正在尝试用 PHP 开发一个网络应用程序 订阅 RSS 之前发布的 到 Hub http pubsubhubbub appspot com
  • object() == object() 保证为 False 吗?

    假设我创建了两个类的实例object 这两个实例是否保证彼此不相等 换句话说 就是object object 保证是False 还是依赖于实现 我明白那个object is object 保证是False 但我在这里问的是object ob
  • K-means 仅使用特定数据帧列与 scikit-learn

    我正在使用k means算法从scikit learn库 我想要聚类的值位于具有 3 列的 pandas 数据框中 ID value 1 and value 2 我想使用以下方法对信息进行聚类value 1 and value 2 但我也想
  • 如何在 16 位 x86 实模式下通过 BIOS 访问 USB 端口?

    我是装配世界的新手 我正在尝试编写一些汇编代码来与串行 并行 VGA 键盘等硬件设备进行通信 我在 x86 intel 处理器的实模式下执行此操作 通过从我亲自编写的用于加载汇编代码的 boostrap 启动我的代码 嗯 根据我从阅读教程中
  • std::string::c_str 和 std::string::data 之间有什么区别? [复制]

    这个问题在这里已经有答案了 为什么我想打电话std string data http www cppreference com wiki string data over std string c str http www cpprefer
  • 在 OS X 中安装 Mono Framework 的正确方法

    在已经安装了旧版本 例如 2 10 4 的情况下 是否有正确的方法来安装新版本的 Mono 例如 2 10 5 可以遵循哪条路 卸载旧版本 然后安装新版本 用新版本覆盖旧版本 先感谢您 只需安装即可 不用担心 框架支持多个版本 您最终将获得
  • React JS 在另一个组件中引用函数

    我试图获取通过另一个组件呈现的按钮来引用和 或影响不同组件的状态 var Inputs React createClass getInitialState function return count 1 add function this
  • 将 Facebook 登录添加到 ionic 应用程序

    我也是 Angular 和 Ionic 的新手 尝试了以下教程 https www sitepoint com how to integrate facebook login into a cordova based app https w
  • 调用静态方法的实例

    再会 我有点困惑 我想使用日历 所以我在互联网上搜索它并遇到以下代码 Ca1endar c Calendar getlnstance c set 2011 2 5 1 25 但我了解到这是一个静态方法 Calendar getlnstanc
  • NPOI 数据格式

    我正在使用 NPOI v1 2 3 导出网格 但在使单元格格式正常工作时遇到问题 我有一个类将对象列表导出到 XLS 文件 为每个对象创建一行 并为每个配置的属性添加一个单元格 可以在每个属性级别设置单元格数据格式 我读过您不应该为每个单元