SSIS脚本任务中的C#脚本将“文本”格式的Excel列转换为“常规”

时间:2019-08-12 11:17:28

标签: c# excel visual-studio ssis number-formatting

我正在利用SSIS数据流任务将数据从SQL Server导出到Excel。尽管导出格式设置,但此处所有列均显示为“文本”。因此,我需要开发一个SSIS脚本任务来进行必要的转换。我在开发脚本时遇到了麻烦。

格式化前的Excel工作簿

Excel Workbook Before Formatting 请参见,Excel单元格中没有撇号,并且“数字”类型也为“常规”,但消息显示为该单元格中的数字设置为文本格式或以撇号开头 < / p>

我尝试了Internet上的其他选项,但没有成功。

#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文件外观

What I want through Script in SSIS

我确认相应的列仅具有相关值,除了列标题。

1 个答案:

答案 0 :(得分:1)

在提供解决方案之前,我必须解释一些有关Excel Number Format的问题

什么是数字格式属性?

请参阅Number format codes文档:

  

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

什么是通用号码格式?

请参阅Reset a number to the General format文档:

  

常规格式是Excel在您键入数字时应用的默认数字格式。在大多数情况下,以常规格式格式化的数字会以您键入数字的方式显示。

日期如何在Excel中存储?

引用How Dates Work in Excel

  

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

您的例外结果

您提到:

  

预期结果:编号为16、17、22的列将转换为“常规”,并且看起来像十进制数字。 第31列将转换为“常规”,看起来像日期

根据我们提到的内容,您无法将第31列转换为“常规”并使它看起来像日期。

解决方案

您只需要将NumberFormat属性设置为空字符串即可将其设置为“常规”

ExcelWorksheet.Columns[16].NumberFormat = "";

实验

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

enter image description here

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

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);
            Excel.Range formatRange;
            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如下所示:

enter image description here

讨论与结论

从上图中,我们可以看到所有列均已更改为“通用数字”格式,但是如果值以数字形式存储,则它们将在存储时显示:日期值以Excel序列(数字)形式显示,十进制值即使我们在将格式重新设置为“常规”之前将格式更改为五位,也仅显示了一位小数。

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

参考


更新1

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

ExcelWorksheet.Cells[1,1].EntireColumn.NumberFormat = "";
ExcelWorksheet.Cells[1,2].EntireColumn.NumberFormat = "";