Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SharePoint 2010“;“错误”;打开通过C创建的Excel#_C#_Sharepoint 2010_Openxml_Excel 2010 - Fatal编程技术网

C# SharePoint 2010“;“错误”;打开通过C创建的Excel#

C# SharePoint 2010“;“错误”;打开通过C创建的Excel#,c#,sharepoint-2010,openxml,excel-2010,C#,Sharepoint 2010,Openxml,Excel 2010,情况是这样的:在SharePoint中的某个页面上,用户单击Web部件中的按钮以基于SharePoint中的数据创建报告。此报告是通过C#代码创建的Excel文档。创建报告时,报告将上载到SharePoint。上传完成后,文件将自动为用户打开,以便文件可以在本地保存或打印或执行其他操作 以下是我的代码工作原理的简化版: //Prepare the data in a table //Normally there are multiple rows and columns here var fil

情况是这样的:在SharePoint中的某个页面上,用户单击Web部件中的按钮以基于SharePoint中的数据创建报告。此报告是通过C#代码创建的Excel文档。创建报告时,报告将上载到SharePoint。上传完成后,文件将自动为用户打开,以便文件可以在本地保存或打印或执行其他操作

以下是我的代码工作原理的简化版:

//Prepare the data in a table
//Normally there are multiple rows and columns here
var fileName = "Report.xlsx";
var table = new System.Web.UI.WebControls.Table();
table.Rows.Add(new TableRow());
table.Rows[0].Cells.Add(new TableCell());
table.Rows[0].Cells[0].Text = "Some cell value";
CreateWorkbook("My Report", fileName, table);

private void CreateWorkbook(string name, string fileName, Table table)
{
    using (var doc = SpreadsheetDocument.Create(_tempfolder + fileName, SpreadsheetDocumentType.Workbook))
    {
        var sheetData = new SheetData();
        var excelRow = new Row { RowIndex = 1 };

        sheetData .AppendChild(excelRow);

        //Normally there's a loop here going over all the rows and columns
        var tableCellValue = table.Rows[0].Cells[0].Text;
        var excelCell = CreateTextCell("A", 1, tableCellValue);
        excelRow.AppendChild(excelCell);

        doc.AddWorkbookPart().AddNewPart<WorksheetPart>().Worksheet = new Worksheet(sheetData);
        doc.WorkbookPart.Workbook = new Workbook(
            new Sheets(
                new Sheet
                {
                    Id = doc.WorkbookPart.GetIdOfPart(doc.WorkbookPart.WorksheetParts.First()),                    
                    SheetId = 1,
                    Name = name
                }));
        doc.WorkbookPart.Workbook.Save();
        doc.Close();

        //Upload the file to SharePoint
        //Omitted as this is not the issue here
    }
}

private static Cell CreateTextCell(string col, int row, string cellValue)
{
    var cell = new Cell { DataType = new EnumValue<CellValues>(CellValues.InlineString), CellReference = col + row };
    var inlineString = new InlineString();
    var text = new Text { Text = value };

    inlineString.Append(l_objText);
    cell.Append(inlineString);

    return cell;
}
//准备表中的数据
//通常这里有多个行和列
var fileName=“Report.xlsx”;
var table=new System.Web.UI.WebControls.table();
table.Rows.Add(newtablerow());
table.Rows[0].Cells.Add(new TableCell());
table.Rows[0]。单元格[0]。Text=“某些单元格值”;
创建工作簿(“我的报告”、文件名、表格);
私有void CreateWorkbook(字符串名称、字符串文件名、表)
{
使用(var doc=SpreadsheetDocument.Create(_tempfolder+fileName,SpreadsheetDocumentType.Workbook))
{
var sheetData=新的sheetData();
var excelRow=新行{RowIndex=1};
sheetData.AppendChild(excelRow);
//通常这里有一个循环遍历所有的行和列
var tableCellValue=表。行[0]。单元格[0]。文本;
var excelCell=CreateTextCell(“A”,1,tableCellValue);
AppendChild(excelCell);
doc.AddWorkbookPart().AddNewPart().Worksheet=新工作表(sheetData);
doc.WorkbookPart.Workbook=新工作簿(
新床单(
新表
{
Id=doc.WorkbookPart.GetIdOfPart(doc.WorkbookPart.WorksheetParts.First()),
SheetId=1,
Name=Name
}));
doc.WorkbookPart.Workbook.Save();
doc.Close();
//将文件上载到SharePoint
//省略,因为这不是这里的问题
}
}
私有静态单元格CreateTextCell(字符串列、int行、字符串单元格值)
{
var cell=new cell{DataType=new EnumValue(CellValues.InlineString),CellReference=col+row};
var inlineString=新的inlineString();
var text=新文本{text=value};
Append(l_objText);
cell.Append(inlineString);
返回单元;
}
代码中的所有内容都正常工作,Excel文件已成功创建和上载,在所有这些Excel打开后,我收到以下消息:

Excel在“…”中发现不可读的内容。是否要恢复此工作簿的内容?如果您信任此工作簿的来源,请单击“是”

当我单击“是”时,Excel会神奇地修复并打开内容,所有内容都显示为正常。但是这个错误是从哪里来的呢?我在互联网上查找过这个问题,在几乎所有的情况下,这个问题的根源都是宏、公式和其他奇异的Excel内容。但在本例中,仅使用字符串值添加一个单元格

有人知道如何解决这个问题吗

编辑:

在记事本中打开文件不是一个解决方案,因为这样会产生如下输出:

PK©QiAÙ9
1 A A A A A xl/1 A A A A A A A A xl/1 A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A由哥伦布·格乌夫·沃罗什·勒夫创作的kÆÕwÒU½ÈZú¾¸Ûè感谢我发现了这个问题。使用OpenXmlValidator类,您可以很容易地在创建的文件中找到错误。在我的情况下,问题是我的一张工作表的标题/名称超过31个字符,31个似乎是限制。问题解决了,因此对于任何有类似问题的人,我都会y建议使用验证器!;)

而不是在excel中打开,保存生成的文件并在记事本或其他东西中打开。查看文件中是否有可能损坏输出的垃圾。请找出文件损坏的位置(如Mark B所指出)-是否创建文件、上载到SharePoint、通过Excel从SharePoint获取……Fiddler将有助于验证下载的Excel文档是否已损坏……检查我问题中的编辑: