我正在使用SautinSoft.XlsToPdf.dll将xls转换为pdf。 它在控制台应用程序中正常工作,但是错误“对象引用未设置为对象的实例”。在Web应用程序中,我不知道为什么。
protected void Page_Init(object sender, EventArgs e)
{
byte[] pdfBytes = FromExcel(Server.MapPath("~/Doc/PlanningGame.xlsx"));
Response.AppendHeader("content-disposition", "attachment; filename=PlanningGame.pdf");
Response.ContentType = "application/octet-stream";
Response.Write(pdfBytes);
Response.Flush();
Response.End();
}
public static byte[] FromExcel(string xlsFile)
{
XlsToPdf xtop = new SautinSoft.XlsToPdf();
byte[] pdfBytes = null;
xtop.ConvertBytes(File.ReadAllBytes(xlsFile), ref pdfBytes);//"Object reference not set to an instance of an object."
string tempFileName = string.Format("{0}{1}", Config.TempDirectory, Guid.NewGuid().ToString());
var bw = new BinaryWriter(new FileStream(tempFileName, FileMode.CreateNew));
bw.Write(pdfBytes);
bw.Close();
return pdfBytes;
}
File.ReadAllBytes(xlsFile)返回一个字节数组,因此它不是null。 xtop也不是空的。
更新 如果xlsFile位于Web应用程序目录中,则会引发错误。如果我使用这样的东西
byte[] pdfBytes = null;
xtop.ConvertBytes(File.ReadAllBytes("c:\\ExcelSheet.xls"), ref pdfBytes);
错误不会抛出。
有什么想法吗?
答案 0 :(得分:1)
安全?我猜你的服务器无法访问包含该文档的目录。
编辑首先让我们检查一下:
public static byte[] FromExcel(string xlsFile)
{
XlsToPdf xtop = new SautinSoft.XlsToPdf();
byte[] xlsBytes = File.ReadAllBytes(xlsFile);
// is xlsBytes null? put a break-point here, or debug-print statement if you can't debug a running server.
byte[] pdfBytes = null;
xtop.ConvertBytes(xlsBytes, ref pdfBytes);
string tempFileName = string.Format("{0}{1}", Config.TempDirectory, Guid.NewGuid().ToString());
var bw = new BinaryWriter(new FileStream(tempFileName, FileMode.CreateNew));
bw.Write(pdfBytes);
bw.Close();
return pdfBytes;
}