将表单添加到Excel工作簿

时间:2017-07-17 11:24:07

标签: c# excel

我尝试将第二张表添加到excel文档中,其中每张表都是Datatable。我发现在添加附加工作表时,第一张工作表正在擦除数据。为什么这样,以及如何确保数据不被删除?

void Export(DataTable dt)
{
    Microsoft.Office.Interop.Excel.Application excel = null;
    Microsoft.Office.Interop.Excel.Workbook wb = null;

    object missing = Type.Missing;
    Microsoft.Office.Interop.Excel.Worksheet ws = null;
    Microsoft.Office.Interop.Excel.Range rng = null;

    try
    {
        excel = new Microsoft.Office.Interop.Excel.Application();
        wb = excel.Workbooks.Add();
        if (firstRun)
        {
            ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.ActiveSheet;
        }
        else
        {
            ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.Add();
        }

        for (int Idx = 0; Idx < dt.Columns.Count; Idx++)
        {
            ws.Range["A1"].Offset[0, Idx].Value = dt.Columns[Idx].ColumnName;
        }
        for (int Idx = 0; Idx < dt.Rows.Count; Idx++)
        {  
            ws.Range["A2"].Offset[Idx].Resize[1, dt.Columns.Count].Value =
            dt.Rows[Idx].ItemArray;
        }

        if (!firstRun)
        {
            excel.Visible = true;
            wb.Activate();
        }
        firstRun = false;
    }
    catch (COMException ex)
    {
        MessageBox.Show("Error accessing Excel: " + ex.ToString());
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error: " + ex.ToString());
    }
}

2 个答案:

答案 0 :(得分:0)

可能dt未正确分配给正确的worksheet。因此,ws.Range["A1"].Offset[0, Idx].Value = dt.Columns[Idx].ColumnName;Null值转换为ws,因此它正在删除数据。

相当多,我很确定您的错误是由于您在第一个条件之后没有使用{}这一事实。

明智地使用它们 - Does C# support if codeblocks without braces?

答案 1 :(得分:0)

非常愚蠢的错误,这是因为我每次都会添加一个新的工作簿来覆盖所有内容。移出初始化工作。

void initExcel()
    {
        excel = new Microsoft.Office.Interop.Excel.Application();
        wb = excel.Workbooks.Add();
    }
void AddToExcel(DataTable dt)
    {
        try
        {
            if (firstRun)
            {
                ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.ActiveSheet;
            }
            else
            {
                ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.Add();
            }

            for (int Idx = 0; Idx < dt.Columns.Count; Idx++)
            {
                ws.Range["A1"].Offset[0, Idx].Value = dt.Columns[Idx].ColumnName;
            }

            for (int Idx = 0; Idx < dt.Rows.Count; Idx++)
            {  
                ws.Range["A2"].Offset[Idx].Resize[1, dt.Columns.Count].Value =
                dt.Rows[Idx].ItemArray;
            }

            if (lastRun)
            {
                excel.Visible = true;
                wb.Activate();
            }
            firstRun = false;
        }
        catch (COMException ex)
        {
            MessageBox.Show("Error accessing Excel: " + ex.ToString());
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.ToString());
        }
    }