我使用SSIS数据流任务将数据从Server导出到Excel。在这里,所有列都显示为文本,尽管导出格式。因此,我需要开发一个SSIS脚本任务来完成必要的转换。我在开发这个脚本时遇到了麻烦。
格式化之前的工作簿
请看,Excel没有Apostrophe,数字类型也是"General“,但是消息说,这个单元格中的数字被格式化为文本,或者前面有一个撇号
我在互联网上尝试过不同的选择,但都失败了。
#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文件的样子。
我确认相应的列只有相关的值,但列标题除外。
发布于 2019-08-14 14:59:46
在提供解决方案之前,我必须解释有关Excel编号格式的一些要点
什么是数字格式属性?
参考数字格式码文档:
您可以使用数字格式更改数字的外观,包括日期和时间,而不更改实际数字。数字格式不影响Excel用于执行计算的单元格值。实际值显示在公式栏中。
什么是通用数字格式?
参考将数字重置为通用格式文档:
通用格式是在键入数字时应用的默认数字格式。在大多数情况下,使用通用格式格式化的数字的显示方式与键入它们的方式相同。
如何将日期存储在Excel中?
Excel中的日期实际上以数字形式存储,然后格式化以显示日期。
你的例外结果
你提到:
预期结果:编号为16、17、22的列将转换为"General“,看起来像十进制数。列31将转换为"General“,看起来类似于Date。
基于我们提到的,您不能将第31列转换为"General“,并使其看起来像日期。
解决方案
只需将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);
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
,而是尝试使用以下代码:
ExcelWorksheet.Cells[1,1].EntireColumn.NumberFormat = "";
ExcelWorksheet.Cells[1,2].EntireColumn.NumberFormat = "";
https://stackoverflow.com/questions/57460180
复制