Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.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# 为什么我的WorkbookView序列不断返回;空";OpenXml的价值?_C#_Html_Asp.net_Excel_Openxml - Fatal编程技术网

C# 为什么我的WorkbookView序列不断返回;空";OpenXml的价值?

C# 为什么我的WorkbookView序列不断返回;空";OpenXml的价值?,c#,html,asp.net,excel,openxml,C#,Html,Asp.net,Excel,Openxml,我在C#/asp.net中创建了一个下载按钮,它采用GridView,将其转换为数据表,然后将其存储到.xlsx文件中。之后我想做的是能够更改我创建的电子表格的活动选项卡 代码如下: protected void downloadBtn_Click(object sender, EventArgs e) { using (var spreadSheet = SpreadsheetDocument.Create(Server.MapPath("~/Downloads/T

我在C#/asp.net中创建了一个下载按钮,它采用GridView,将其转换为数据表,然后将其存储到.xlsx文件中。之后我想做的是能够更改我创建的电子表格的活动选项卡

代码如下:

 protected void downloadBtn_Click(object sender, EventArgs e)
    {

        using (var spreadSheet = SpreadsheetDocument.Create(Server.MapPath("~/Downloads/TestSheet.xlsx"), DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
        {
            WorkbookPart workbookPart = spreadSheet.AddWorkbookPart();
            workbookPart.Workbook = new Workbook();

            WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
            worksheetPart.Worksheet = new Worksheet(new SheetData());

            //Fine up to this point

            spreadSheet.WorkbookPart.Workbook.Sheets = new Sheets();

            DataTable table = new DataTable();
            //Converts GridView into Data Table **
            for (int i = 0; i < gvEmployee.HeaderRow.Cells.Count - 1; i++)
            {

                table.Columns.Add(gvEmployee.HeaderRow.Cells[i + 1].Text);
            }
            // fill rows     
            for (int i = 0; i < gvEmployee.Rows.Count; i++)
            {
                DataRow dr = table.NewRow();
                for (int j = 0; j < gvEmployee.Columns.Count - 1; j++)
                {
                    dr[j] = gvEmployee.Rows[i].Cells[j + 1].Text;
                }
                table.Rows.Add(dr);

            }

            var sheetPart = spreadSheet.WorkbookPart.AddNewPart<WorksheetPart>();
            var sheetData = new SheetData();
            sheetPart.Worksheet = new Worksheet(sheetData);

            Sheets sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>();
            string relationshipId = spreadSheet.WorkbookPart.GetIdOfPart(sheetPart);

            uint sheetId = 1;
            if (sheets.Elements<Sheet>().Count() > 0)
            {
                sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
            }

            Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = "TestSheet" };
            sheets.Append(sheet);

            Row headerRow = new Row();
            List<String> columns = new List<string>();
            foreach (DataColumn column in table.Columns)
            {

                columns.Add(column.ColumnName);

                Cell cell = new Cell();
                cell.DataType = CellValues.String;
                cell.CellValue = new CellValue(column.ColumnName);
                headerRow.AppendChild(cell);
            }


            sheetData.AppendChild(headerRow);
            foreach (DataRow dsrow in table.Rows)
            {
                Row newRow = new Row();
                foreach (String col in columns)
                {
                    Cell cell = new Cell();
                    cell.DataType = CellValues.String;
                    cell.CellValue = new CellValue(dsrow[col].ToString()); //
                    newRow.AppendChild(cell);
                }

                sheetData.AppendChild(newRow);
            }


            Sheet sheet2 = new Sheet() { Id = spreadSheet.WorkbookPart.GetIdOfPart(sheetPart), SheetId = 2, Name = "AdditionalSheet" };
            sheets.Append(sheet2);

            var sheetIndex = workbookPart.Workbook.Descendants<Sheet>().ToList().IndexOf(sheet2);
            WorkbookView workbookView = workbookPart.Workbook.Descendants<WorkbookView>().FirstOrDefault(); //new WorkbookView();
            workbookView.ActiveTab = Convert.ToUInt32(sheetIndex);

            workbookPart.Workbook.Save();
            spreadSheet.Close();

        }
    }
protectedvoid downloadBtn\u单击(对象发送者,事件参数e)
{
使用(var spreadSheet=SpreadsheetDocument.Create(Server.MapPath(“~/Downloads/TestSheet.xlsx”)、DocumentFormat.OpenXml.SpreadsheetDocumentType.工作簿))
{
WorkbookPart WorkbookPart=电子表格。AddWorkbookPart();
workbookPart.工作簿=新工作簿();
WorksheetPart WorksheetPart=workbookPart.AddNewPart();
worksheetPart.Worksheet=新工作表(new SheetData());
//到目前为止还不错
电子表格.WorkbookPart.Workbook.Sheets=新工作表();
DataTable=新的DataTable();
//将GridView转换为数据表**
对于(int i=0;i0)
{
sheetId=sheets.Elements()。选择(s=>s.sheetId.Value)。Max()+1;
}
Sheet Sheet=new Sheet(){Id=relationshipId,SheetId=SheetId,Name=“TestSheet”};
附页(页);
Row headerRow=新行();
列表列=新列表();
foreach(table.Columns中的DataColumn列)
{
columns.Add(column.ColumnName);
单元格=新单元格();
cell.DataType=CellValues.String;
cell.CellValue=新的CellValue(column.ColumnName);
头附子(单元);
}
sheetData.AppendChild(headerRow);
foreach(table.Rows中的数据行dsrow)
{
行newRow=新行();
foreach(列中的字符串列)
{
单元格=新单元格();
cell.DataType=CellValues.String;
cell.CellValue=新的CellValue(dsrow[col].ToString())//
newRow.AppendChild(单元格);
}
sheetData.AppendChild(纽罗);
}
SheetSheet2=new Sheet(){Id=spreadSheet.WorkbookPart.GetIdOfPart(sheetPart),SheetId=2,Name=“AdditionalSheet”};
附页(第2页);
var sheetIndex=workbookPart.Workbook.subjects().ToList().IndexOf(sheet2);
WorkbookView WorkbookView=workbookPart.工作簿.Subjections().FirstOrDefault();//新建WorkbookView();
workbookView.ActiveTab=Convert.ToUInt32(sheetIndex);
workbookPart.Workbook.Save();
spreadSheet.Close();
}
}
当我试图运行这段代码时,它在最后几行的“workbookView.ActiveTab”上抛出一个错误

System.NullReferenceException:“对象引用未设置为对象的实例。”

工作簿视图为空。


你知道它为什么要这样做吗?

好吧,我刚弄明白是什么错了,没有初始化WorkbookView,因为我认为它不需要初始化。但在更改工作簿之前,您必须实际创建工作簿视图。我只需要这一行:

            workbookPart.Workbook.Append(new BookViews(new WorkbookView()));

我认为您是在创建新工作簿,而不是将工作表放入现有工作簿。好的,我只是尝试关闭电子表格,然后用另一个“using语句”重新打开它,并尝试选择该语句中的活动选项卡,但它仍然返回空值。任何其他提示都将不胜感激!您是否打开了一个或两个工作簿?我只打开了一个名为TestSheet.xlsx的工作簿,因为它在路径中被命名。当我注释掉试图选择活动选项卡的部分时,它会使用“TestSheet”和“AdditionalSheet”将工作簿成功保存到服务器,但当我取消注释该部分时,它会显示“workbookView为空”。在发生错误的位置放置断点,然后检查打开的excel应用程序,并验证只有一个工作簿打开。单击任务栏上的excel图标。