Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SSIS脚本任务中的C#脚本将"Text“格式的Excel列转换为”通用“

SSIS脚本任务中的C#脚本将"Text“格式的Excel列转换为”通用“
EN

Stack Overflow用户
提问于 2019-08-12 03:17:28
回答 1查看 3.5K关注 0票数 3

我使用SSIS数据流任务将数据从Server导出到Excel。在这里,所有列都显示为文本,尽管导出格式。因此,我需要开发一个SSIS脚本任务来完成必要的转换。我在开发这个脚本时遇到了麻烦。

格式化之前的工作簿

请看,Excel没有Apostrophe,数字类型也是"General“,但是消息说,这个单元格中的数字被格式化为文本,或者前面有一个撇号

我在互联网上尝试过不同的选择,但都失败了。

代码语言:javascript
运行
AI代码解释
复制
#region Namespaces
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
#endregion

namespace ST_de899f405b7b4083b0ad8cba6b3df2e3
{

[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
    public void Main()
    {
        string inputFile = (string)Dts.Variables["Target_FullFilePath"].Value;
        Excel.Application ExcelApp = new Excel.Application();
        Excel.Workbook ExcelWorkbook = ExcelApp.Workbooks.Open(inputFile);
        Excel.Range formatRange;
        ExcelApp.Visible = true;

        foreach (Excel.Worksheet ExcelWorksheet in ExcelWorkbook.Sheets)
        {
            ExcelWorksheet.Select(Type.Missing);
            ExcelWorksheet.Columns[2].NumberFormat = "";
            ExcelWorksheet.Columns[3].NumberFormat = "";
            ExcelWorksheet.Columns[4].NumberFormat = "0.00000";
            ExcelWorksheet.Columns[5].NumberFormat = "yyyy-MM-dd";
        }

        ExcelWorkbook.Save();

        GC.Collect();
        GC.WaitForPendingFinalizers();

        ExcelWorkbook.Close(Type.Missing, Type.Missing, Type.Missing);
        Marshal.FinalReleaseComObject(ExcelWorkbook);

        ExcelApp.Quit();
        Marshal.FinalReleaseComObject(ExcelApp);
    }   
    enum ScriptResults
    {
        Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
        Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    };
    #endregion
}
}

预期结果:列编号为B、C、D,看起来类似于十进制/整数,并且同样被过滤。列E看起来与日期相似,也类似地被过滤。

--这就是我希望通过SSIS格式化后,Excel文件的样子。

我确认相应的列只有相关的值,但列标题除外。

EN

回答 1

Stack Overflow用户

发布于 2019-08-14 14:59:46

在提供解决方案之前,我必须解释有关Excel编号格式的一些要点

什么是数字格式属性?

参考数字格式码文档:

您可以使用数字格式更改数字的外观,包括日期和时间,而不更改实际数字。数字格式不影响Excel用于执行计算的单元格值。实际值显示在公式栏中。

什么是通用数字格式?

参考将数字重置为通用格式文档:

通用格式是在键入数字时应用的默认数字格式。在大多数情况下,使用通用格式格式化的数字的显示方式与键入它们的方式相同。

如何将日期存储在Excel中?

提及日期在Excel中的工作方式

Excel中的日期实际上以数字形式存储,然后格式化以显示日期。

你的例外结果

你提到:

预期结果:编号为16、17、22的列将转换为"General“,看起来像十进制数。列31将转换为"General“,看起来类似于Date。

基于我们提到的,您不能将第31列转换为"General“,并使其看起来像日期。

解决方案

只需将NumberFormat属性设置为空字符串即可将其设置为“通用”

代码语言:javascript
运行
AI代码解释
复制
ExcelWorksheet.Columns[16].NumberFormat = "";

实验

我创建了一个包含4列的Excel文件: NumberColumn、DateColumn、DecimalColumn和StringColumn,如上图所示:

我用以下代码创建了一个控制台应用程序:

代码语言:javascript
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string inputFile = @"D:\Test.xlsx";

            Excel.Application ExcelApp = new Excel.Application();
            Excel.Workbook ExcelWorkbook = ExcelApp.Workbooks.Open(inputFile);
            ExcelApp.Visible = true;

            foreach (Excel.Worksheet ExcelWorksheet in ExcelWorkbook.Sheets)
            {
                ExcelWorksheet.Select(Type.Missing);

                ExcelWorksheet.Columns[1].NumberFormat = "";
                ExcelWorksheet.Columns[2].NumberFormat = "yyyy-MM-dd"; // convert format to date
                ExcelWorksheet.Columns[2].NumberFormat = "";
                ExcelWorksheet.Columns[3].NumberFormat = "0.00000"; // convert format to decimal with 5 decimal digits
                ExcelWorksheet.Columns[3].NumberFormat = "";
                ExcelWorksheet.Columns[4].NumberFormat = "";


            }
            ExcelWorkbook.Save();

            GC.Collect();
            GC.WaitForPendingFinalizers();

            ExcelWorkbook.Close(Type.Missing, Type.Missing, Type.Missing);
            Marshal.FinalReleaseComObject(ExcelWorkbook);

            ExcelApp.Quit();
            Marshal.FinalReleaseComObject(ExcelApp);
        }
    }
}

执行应用程序后,Excel如下所示:

讨论和结论

从上面的图像中,我们可以看到所有列都被更改为通用数字格式,但是如果值被存储为数字,它们将显示为存储:日期值显示为Excel序列化(数字),小数值仅以一位小数显示,即使我们在将格式重置为General之前将格式更改为五位数。

简而言之,当数字格式为"General“时,不能处理如何显示值,如果需要将值显示为日期,则必须将数字格式设置为yyyy-MM-dd或任何其他日期格式。

参考文献

更新1

不要使用ExcelWorksheet.Columns[1].NumberFormat,而是尝试使用以下代码:

代码语言:javascript
运行
AI代码解释
复制
ExcelWorksheet.Cells[1,1].EntireColumn.NumberFormat = "";
ExcelWorksheet.Cells[1,2].EntireColumn.NumberFormat = "";
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57460180

复制
相关文章
WPF 调试因为对象不同而绑定失效问题
在 WPF 使用绑定的时候,发现绑定不上,也许是因为绑定的对象不是当前作用的对象的原因。也许是绑定错了对象,或者对象被变更了。本文来告诉大家这个调试思路和方法
林德熙
2020/11/06
9200
同一页插入不同页码
报告或论文集是由许多篇文档汇集而来,既需要说明某一页在当前文档中的页码,又需要说明该页在整个文集中的页码,这就出现了同一页面设置不同页码的情况,利用域很容易解决这个问题。
P轴
2022/11/18
7980
git为不同的项目设置不同的邮箱
在我们使用Git开发项目的时候,可能经常会碰到个人和公司开发的项目都在一台机器上的情况。不管你们有没有,反正我是碰到了。因为公司有公司自己分配的邮箱,而我自己喜欢用自己的邮箱开发自己的项目。这样可能会导致邮箱混用的情况。
魔王卷子
2019/05/31
1.4K0
用Banber实现同一份报表,不同人看不同数据
在报表的使用过程中,用户经常有这样的需求:以一个销售团队为例,如果该销售团队的业务范围是全国,那么意味着该销售团队需要随时掌握30多个省的销售情况,而且每一个省还有若干个城市,每一个城市还有若干个县;随着业务量的不断增大和扩容,该销售团队所要查阅的销售数据也会日益增加。在如此庞大且复杂的数据中,如果能够实现每一个区域的负责人只看到自己负责的那份数据,那么既可以提高相关责任人的工作效率,又可以避免泄露敏感的商业数据。
Banber可视化云平台
2021/07/06
7590
用Banber实现同一份报表,不同人看不同数据
同一域名下,不同的URL的路径转发到不同服务上
这种配置常用于一个网站通过不同的路径提供不同服务的场景。 通过如下的访问配置: 对 http://my.nginx.test/hello-k8s 的访问将被路由到后端名为"hello-k8s-svc" 的Service。 对 http://my.nginx.test/hello-world 的访问将被路由到后端名为"hello-world-svc" 的Service。 ingress.yaml如下: apiVersion: extensions/v1beta1 kind: Ingress metadata:
院长技术
2022/03/10
3.5K0
同一域名下,不同的URL的路径转发到不同服务上
winform treeView 数据绑定
转载:http://www.jetwu.cn/archives/737 winform treeView 数据绑定 private void Form1_Load(object sender, EventArgs e) { Types = new List<UrlTypes>() { new UrlTypes() {Id = 1, Name = "中国", Value = "0", ParentId = 0},
跟着阿笨一起玩NET
2018/09/19
1.9K0
在同一word文档中设置不同页码
(opens new window) 1、把文档结构确定好,比如封面、目录和正文,然后在每一部分与每一部分之间插入分隔符,具体操作为:点击“页面布局”-“分隔符”-“下一节”。注意要把光标放在两部分即封面与目录之间哦。 2、点击“插入”-"页码"-“页面底端”,选择自己需要的页码样式。 3、取消分节链接。word默认的节是链接到前一节的(即与前一节有相同的页面格式),因此要将节与节之间的链接取消掉。点击页码,点击“取消链接到前一条页眉” 4、封面部分不要页码,直接选中页码手动删除即可,操作如下图所示。因为封面部分已经独立为一节,所以不会受其他部分影响。 5、点击“页码”-“设置页码格式“,会出现如下对话框。在编号格式里选择罗马数字,在页码编号里选择起始页码,填I,点确定。 6、正文部分按照相同的方法设置成阿拉伯数字页码。这样整篇文章的页码就弄好了哦。
P轴
2022/11/18
2.1K0
IIS7 多域名绑定同一物理目录不同默认文档的实现方法
因为在一个物理目录下只有一个web.config,并且IIS7把默认文档设置写在这里,导致所有域名的默认文档设置共享。
会长君
2023/04/26
1.3K0
Power BI同一数据显示不同单位
一位群友遇到一个问题,数据差异非常大,有的上亿,有的只有几百。如何更好的显示这样的数据?
wujunmin
2022/05/19
1.1K0
Power BI同一数据显示不同单位
同一个测试类内部或者不同测试类之间的@Test执行顺序
JUnit4.11之后提供了MethodSorters,在测试类上加注解@FixMethodOrder(value)可以有三种方式对test执行顺序进行指定,如下: 默认(MethodSorters.DEFAULT),按方法名(MethodSorters.NAME_ASCENDING)和JVM(MethodSorters.JVM)
用户7705674
2021/10/07
3.4K0
为matplotlib设置不同的主题
所谓主题,其实就是一套样式规则,对背景色,坐标轴,标题等图形基本元素的样式进行设定。R语言的ggplot2中,通过theme来指定图片主题,既可以采用系统自带的主题,也可以自定义其中的各个元素。
生信修炼手册
2020/09/04
2K0
为matplotlib设置不同的主题
遍历类的属性和值,取两个类的同一属性的不同值。
try { Field[] fields = college.getClass().getDeclaredFields(); Field[] fieldsOld = collegeOld.getClass().getDeclaredFields(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; field.setAccessible(true);
qubianzhong
2018/09/19
2.1K0
DOM对象与jquery对象有什么不同
1.jQuery对象和DOM对象 DOM对象,即是我们用传统的方法(javascript)获得的对象,jQuery对象即是用jQuery类库的选择器获得的对象; var domObj = document.getElementById("id"); //DOM对象 var $obj = $("#id"); //jQuery对象; jQuery对象就是通过jQuery包装DOM对象后产生的对象,它是jQuery独有的。如果一个对象是jQuery对象,那么就可以使用jQuery里的方法,例: $("#foo").html(); //获取id为foo的元素内的html代码,html()是jQuery特有的方法; 上面的那段代码等同于: document.getElementById("foo").innerHTML; 注意:在jQuery对象中无法使用DOM对象的任何方法。 例如$("#id").innerHTML 和$("#id").checked之类的写法都是错误的,可以用$("#id").html()和$("#id").attr ("checked")之类的 jQuery方法来代替。同样,DOM对象也不能使用jQuery方法。学习jQuery开始就应当树立正确的观念,分清jQuery对象和DOM对象之间的区别,之后学习 jQuery就会轻松很多的。
用户5640963
2019/07/28
9720
同一个公司,“不同”的乐享?!
刚过完新年,乐乐就马不停蹄地跑去北京出差,负责北京分公司企业文化的小姐姐一边吃着羊蝎子一边和乐乐吐槽:
腾讯乐享
2019/03/12
8290
同一个公司,“不同”的乐享?!
如何在同一域名下,加载不同项目
前提,多个项目功能重复,每次开发都需要复制一份代码且需同时维护多个项目。如:后台管理功能中的菜单管理、角色管理等。
玖柒的小窝
2021/11/04
7980
如何在同一域名下,加载不同项目
[代码结构设计]根据不同条件使用不同实现类的业务代码设计
这样大家可能不是太理解。举个例子,现在大街小巷上的商户都采用了聚合支付的支付方式,聚合支付也就是商户柜台前放了一个支持支付宝、微信、京东钱包、银联等等的二维码,用户可以通过任意一款支付APP进行支付。
云枭
2018/11/08
2.4K0
VB.NET 为Treeview控件每个节点绑定独立的事件
  TreeView树状控件,在日常开发中我们会经常用到,但是我们在使用的过程中,想要点击某个节点触发某个过程方法;我们(哦不,是我自己)日常的做法,是使用节点点击事件(NodeMouseClick或者AfterSelect)去根据节点名称Name或者节点Text逐一判断然后触发某个过程,不能把每个节点当作一个按钮来操作;
办公魔盒
2021/07/23
1.6K0
javafx框架tornadofx入门25_treeview_显示不同的数据类型
25treeview-company-department-staff.gif 使用treeview显示公司-部门-员工数据 import javafx.scene.control.TreeItem import tornadofx.* class MainView25 : View("tornadofx入门25_treeview_显示不同的数据类型") { val companies = (1..5).map { Company("Company$it") }
用户6167008
2020/04/14
1.6K1
javafx框架tornadofx入门25_treeview_显示不同的数据类型
Linux 多核下绑定硬件中断到不同 CPU
硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下如果有办法把大量硬件中断分配给不同的 CPU (core) 处理显然能很好的平衡性能。 现在的服务器上动不动就是多 CPU 多核、多网卡、多硬盘,如果能让网卡中断独占1个 CPU (core)、磁盘 IO 中断独占1个 CPU 的话将会大大减轻单一 CPU 的负担、提高整体处理效率。 VPSee 前天收到一位网友的邮件提到了 SMP IRQ Affinity,引发了今天的话题:D,以下操作在 SUN FIre X2100 M2 服务器+
小小科
2018/05/03
5.7K0
基于不同视角的安全管理
常常被问到几个类似的问题“为什么国内很少听到真正CSO、CISO的职位与人员”、“如何做好一个企业的安全负责人”“一个企业安全负责人应该具备什么样的能力要素”等等。
FB客服
2018/07/31
1.1K0
基于不同视角的安全管理

相似问题

Guice -基于封闭类绑定不同的实例

10

将TreeView绑定到同一级别上具有不同类型对象的集合

113

基于类绑定创建不同类型对象的单个提供程序

10

treeview类绑定

13

为同一类的不同对象的update()分配不同的代码

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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