我创建了一个SSIS包,目前有以下步骤:
1 - 文件系统任务 - 复制Excel文件(.xlsx)以用作SSIS包输出的模板。 Excel文件有3个选项卡 - 一个没有数据,但是具有引用第二个和第三个选项卡上的值的公式。这是最终用户查看的页面(让我们称之为end_user)。
2 - 数据流任务 - OLEDB源 - >数据转换 - > Excel目标(选项卡2,我们称之为raw_data)。
3 - 电子邮件任务 - 尚未实施,但将在产品的最后阶段进行,以实现全自动化。
运行包完成后,我打开Excel文件,数据已写入raw_data,但是在end_user上没有显示任何内容。以下是我已经尝试过的,在Excel中解决此问题:
创建Excel宏以在文件打开时强制进行公式更新。
Private Sub Workbook_Open()
Application.Calculation = xlCalculationAutomatic
End Sub
在Office上运行修复。
虽然 Ctrl + Alt + F9 选项使文件按预期显示,但这不是一个可接受的解决方案,因为我们都知道最终用户希望一切都完美无缺。有没有人有这方面的建议,经验或任何其他见解?非常感谢任何有用的东西!
答案 0 :(得分:0)
我遇到了同样的情况。所以即使这个问题已经超过 3 年了,我还是希望我的解决方案可以帮助其他人。
我使用以下 C# 代码创建了一个脚本任务(您只需编辑 TheNameOfYourExcelConnection.xls)。
该脚本将连接到电子表格,遍历每个工作表中的每个单元格,并将每次出现的“=”替换为自身。实际上并没有改变公式,而是强制重新计算它们。
#region Namespaces
using System;
using Microsoft.SqlServer.Dts.Runtime;
//add reference C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll
using Excel = Microsoft.Office.Interop.Excel;
#endregion
namespace ST_10cafd32acda4eb1b677ebbdd2eb1286
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
public void Main()
{
Excel.Application excelApp = new Excel.Application();
ConnectionManager cm = Dts.Connections["TheNameOfYourExcelConnection.xls"];
string filepath = cm.Properties["ExcelFilePath"].GetValue(cm).ToString();
excelApp.DisplayAlerts = false;
Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(filepath, 1, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, null, false);
try
{
Excel.Sheets excelWorkSheet = excelWorkbook.Sheets;
foreach (Excel.Worksheet work in excelWorkSheet)
{
work.Cells.Replace("=", "=");
}
excelWorkbook.Save();
excelWorkbook.Close();
}
catch (Exception ex)
{
}
finally
{
excelApp.Quit();
}
Dts.TaskResult = (int)ScriptResults.Success;
}
#region ScriptResults declaration
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
}
}