我正在利用SSIS数据流任务将数据从SQL Server导出到Excel。尽管导出格式设置,但此处所有列均显示为“文本”。因此,我需要开发一个SSIS脚本任务来进行必要的转换。我在开发脚本时遇到了麻烦。
格式化前的Excel工作簿
请参见,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文件外观
我确认相应的列仅具有相关值,除了列标题。
答案 0 :(得分:1)
在提供解决方案之前,我必须解释一些有关Excel Number Format的问题
请参阅Number format codes文档:
您可以使用数字格式来更改数字的外观(包括日期和时间),不更改实际数字。数字格式不会影响Excel用于执行计算的单元格值。实际值显示在编辑栏中。
请参阅Reset a number to the General format文档:
常规格式是Excel在您键入数字时应用的默认数字格式。在大多数情况下,以常规格式格式化的数字会以您键入数字的方式显示。
Excel中的日期实际上存储为数字,然后格式化以显示日期。
您提到:
预期结果:编号为16、17、22的列将转换为“常规”,并且看起来像十进制数字。 第31列将转换为“常规”,看起来像日期。
根据我们提到的内容,您无法将第31列转换为“常规”并使它看起来像日期。
您只需要将NumberFormat
属性设置为空字符串即可将其设置为“常规”
ExcelWorksheet.Columns[16].NumberFormat = "";
我创建了一个包含4列的Excel文件:NumberColumn,DateColumn,DecimalColumn和StringColumn,如上图所示:
我使用以下代码创建了控制台应用程序:
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如下所示:
从上图中,我们可以看到所有列均已更改为“通用数字”格式,但是如果值以数字形式存储,则它们将在存储时显示:日期值以Excel序列(数字)形式显示,十进制值即使我们在将格式重新设置为“常规”之前将格式更改为五位,也仅显示了一位小数。
简而言之,当数字格式为“常规”时,您无法处理如何显示值,如果您需要将值显示为日期,则必须将数字格式设置为yyyy-MM-dd
或任何其他日期格式。
请尝试使用以下代码,而不是使用ExcelWorksheet.Columns[1].NumberFormat
:
ExcelWorksheet.Cells[1,1].EntireColumn.NumberFormat = "";
ExcelWorksheet.Cells[1,2].EntireColumn.NumberFormat = "";