听起来 Excel 文件在尝试第二次访问时仍处于打开状态。当 Excel 文件打开以进行写入时,它会被锁定,这可能会阻止另一个进程(在您的情况下为 SSIS)编辑该文件。这可以使用带有如下代码的 Smartsheet C# SDK 来确认,该代码在写入文件后永远不会关闭文件。
// Set the Access Token
Token token = new Token();
token.AccessToken = "YOUR_TOKEN";
// Use the Smartsheet Builder to create a Smartsheet
SmartsheetClient smartsheet = new SmartsheetBuilder().SetAccessToken(token.AccessToken).Build();
BinaryWriter output = new BinaryWriter(new FileStream("c:\\file.xls", FileMode.Create));
smartsheet.Sheets().GetSheetAsExcel(8325033727682436L, output);
Console.WriteLine("Done writting");
System.Threading.Thread.Sleep(100000);
运行上面的代码,打开并写入文件后,它会休眠很长时间。当代码处于休眠状态时,您可以尝试手动打开 Excel 文件,您将看到如下所示的对话框,显示我们仍然打开了 Excel 文件(来自我们的代码),即使我们完成了写入。
此问题的解决方案是在我们完成写入后立即关闭 Excel 文件。这可以通过在流上使用 close() 方法或使用using 语句来完成。我更喜欢 using 语句,因此示例如下:
// Set the Access Token
Token token = new Token();
token.AccessToken = "YOUR_TOKEN";
// Use the Smartsheet Builder to create a Smartsheet
SmartsheetClient smartsheet = new SmartsheetBuilder().SetAccessToken(token.AccessToken).Build();
using (BinaryWriter output = new BinaryWriter(new FileStream("c:\\file.xls", FileMode.Create)))
{
smartsheet.Sheets().GetSheetAsExcel(8325033727682436L, output);
}
Console.WriteLine("Done writting");
System.Threading.Thread.Sleep(100000);
现在,如果我们运行上面的代码,它会在最后休眠,但这次 Excel 文件不会被锁定,因为 using 语句在我们完成写入后立即关闭了文件。