C# 数据不能写入excel文件

C# 数据不能写入excel文件,c#,excel,excel-interop,C#,Excel,Excel Interop,我编写了读取excel文件的代码。当我添加联系人值时,我需要将这些值写入excel文件,但问题是这些值无法写入excel文件中的单元格。空白!!!!为什么?我的代码有什么问题 static void Main(string[] args) { var contacts = new List<Contact>(); contacts.Add(new Contact{Firstname = "name 1", Lastname = "last

我编写了读取excel文件的代码。当我添加联系人值时,我需要将这些值写入excel文件,但问题是这些值无法写入excel文件中的单元格。空白!!!!为什么?我的代码有什么问题

 static void Main(string[] args)
    {

        var contacts = new List<Contact>();

        contacts.Add(new Contact{Firstname = "name 1", Lastname = "lastname 1", Email = "email 1", PhoneNumber = "phone 1"});
        contacts.Add(new Contact { Firstname = "name 2", Lastname = "lastname 2", Email = "email 2", PhoneNumber = "phone 2" });

        Application app = new Application();
       // excelapp.Visible = true;


       // _Workbook workbook = (_Workbook)(excelapp.Workbooks.Add(Type.Missing));
        Workbook workbook = app.Workbooks.Open(@"N:\files\transform_results.xlsx");
        _Worksheet worksheet = workbook.Sheets["Sheet1"];
        Range xlRange = worksheet.UsedRange;
        worksheet = (_Worksheet)workbook.ActiveSheet;


        worksheet.Cells[1, 1] = "First Name";
        worksheet.Cells[1, 2] = "Last Name";
        worksheet.Cells[1, 3] = "Email";


        int row = 4;

        foreach (var contact in contacts)
        {


            worksheet.Cells[1, 1] = contact.Firstname;
            worksheet.Cells[1, 2] = contact.Lastname;
            worksheet.Cells[1, 3] = contact.Email;
            worksheet.Cells[1, 4] = contact.PhoneNumber;
        }

        app.UserControl = true;
    }

public class Contact
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
}
static void Main(字符串[]args)
{
var contacts=新列表();
联系人。添加(新联系人{Firstname=“name 1”,Lastname=“Lastname 1”,Email=“Email 1”,PhoneNumber=“phone 1”});
添加(新联系人{Firstname=“name 2”,Lastname=“Lastname 2”,Email=“Email 2”,PhoneNumber=“phone 2”});
应用程序app=新应用程序();
//excelapp.Visible=true;
//工作簿=(\u工作簿)(excelapp.Workbooks.Add(Type.Missing));
工作簿=app.Workbooks.Open(@“N:\files\transform_results.xlsx”);
_工作表=工作簿。工作表[“Sheet1”];
范围xlRange=worksheet.UsedRange;
工作表=(_工作表)workbook.ActiveSheet;
工作表.单元格[1,1]=“名字”;
工作表.单元格[1,2]=“姓氏”;
工作表.单元格[1,3]=“电子邮件”;
int行=4;
foreach(触点中的var触点)
{
worksheet.Cells[1,1]=contact.Firstname;
worksheet.Cells[1,2]=contact.Lastname;
worksheet.Cells[1,3]=contact.Email;
worksheet.Cells[1,4]=contact.PhoneNumber;
}
app.UserControl=true;
}
公共类联系人
{
公共字符串名{get;set;}
公共字符串Lastname{get;set;}
公共字符串电子邮件{get;set;}
公共字符串PhoneNumber{get;set;}
}

这段代码

worksheet.Cells[1, 1]
。。。返回一个范围对象。您需要设置此对象的
Value2
属性以更改单元格的内容:

var cell = worksheet.Cells[1, 1];
cell.Value2 = contact.Firstname;
请参阅:
以及:


请注意,我在上面的例子中非常小心

这段代码

worksheet.Cells[1, 1]
。。。返回一个范围对象。您需要设置此对象的
Value2
属性以更改单元格的内容:

var cell = worksheet.Cells[1, 1];
cell.Value2 = contact.Firstname;
请参阅:
以及:


请注意,我在上面的例子中非常小心

我对此进行了测试,效果良好

static void Main(string[] args)
{
    var contacts = new List<Contact>();

    contacts.Add(new Contact { Firstname = "name 1", Lastname = "lastname 1", Email = "email 1", PhoneNumber = "phone 1" });
    contacts.Add(new Contact { Firstname = "name 2", Lastname = "lastname 2", Email = "email 2", PhoneNumber = "phone 2" });

    Excel.Application app = new Excel.Application();
    app.Visible = true;
    var workbook = app.Workbooks.Open(@"C:\testit.xlsx");
    _Worksheet worksheet = workbook.Sheets["Sheet1"];
    Range xlRange = worksheet.UsedRange;
    worksheet = (_Worksheet)workbook.ActiveSheet;

    worksheet.Cells[1, 1] = "First Name";
    worksheet.Cells[1, 2] = "Last Name";
    worksheet.Cells[1, 3] = "Email";

    int row = 4;

    foreach (var contact in contacts)
    {
        row++;

        worksheet.Cells[row, 1] = contact.Firstname;
        worksheet.Cells[row, 2] = contact.Lastname;
        worksheet.Cells[row, 3] = contact.Email;
        worksheet.Cells[row, 4] = contact.PhoneNumber;
    }

    app.UserControl = true;
    app.Quit();

}

public class Contact
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
}
static void Main(字符串[]args)
{
var contacts=新列表();
联系人。添加(新联系人{Firstname=“name 1”,Lastname=“Lastname 1”,Email=“Email 1”,PhoneNumber=“phone 1”});
添加(新联系人{Firstname=“name 2”,Lastname=“Lastname 2”,Email=“Email 2”,PhoneNumber=“phone 2”});
Excel.Application app=新建Excel.Application();
app.Visible=true;
var workbook=app.Workbooks.Open(@“C:\testit.xlsx”);
_工作表=工作簿。工作表[“Sheet1”];
范围xlRange=worksheet.UsedRange;
工作表=(_工作表)workbook.ActiveSheet;
工作表.单元格[1,1]=“名字”;
工作表.单元格[1,2]=“姓氏”;
工作表.单元格[1,3]=“电子邮件”;
int行=4;
foreach(触点中的var触点)
{
行++;
worksheet.Cells[row,1]=contact.Firstname;
worksheet.Cells[row,2]=contact.Lastname;
worksheet.Cells[行,3]=contact.Email;
worksheet.Cells[行,4]=contact.PhoneNumber;
}
app.UserControl=true;
app.Quit();
}
公共类联系人
{
公共字符串名{get;set;}
公共字符串Lastname{get;set;}
公共字符串电子邮件{get;set;}
公共字符串PhoneNumber{get;set;}
}

我测试了这个,它运行正常

static void Main(string[] args)
{
    var contacts = new List<Contact>();

    contacts.Add(new Contact { Firstname = "name 1", Lastname = "lastname 1", Email = "email 1", PhoneNumber = "phone 1" });
    contacts.Add(new Contact { Firstname = "name 2", Lastname = "lastname 2", Email = "email 2", PhoneNumber = "phone 2" });

    Excel.Application app = new Excel.Application();
    app.Visible = true;
    var workbook = app.Workbooks.Open(@"C:\testit.xlsx");
    _Worksheet worksheet = workbook.Sheets["Sheet1"];
    Range xlRange = worksheet.UsedRange;
    worksheet = (_Worksheet)workbook.ActiveSheet;

    worksheet.Cells[1, 1] = "First Name";
    worksheet.Cells[1, 2] = "Last Name";
    worksheet.Cells[1, 3] = "Email";

    int row = 4;

    foreach (var contact in contacts)
    {
        row++;

        worksheet.Cells[row, 1] = contact.Firstname;
        worksheet.Cells[row, 2] = contact.Lastname;
        worksheet.Cells[row, 3] = contact.Email;
        worksheet.Cells[row, 4] = contact.PhoneNumber;
    }

    app.UserControl = true;
    app.Quit();

}

public class Contact
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
}
static void Main(字符串[]args)
{
var contacts=新列表();
联系人。添加(新联系人{Firstname=“name 1”,Lastname=“Lastname 1”,Email=“Email 1”,PhoneNumber=“phone 1”});
添加(新联系人{Firstname=“name 2”,Lastname=“Lastname 2”,Email=“Email 2”,PhoneNumber=“phone 2”});
Excel.Application app=新建Excel.Application();
app.Visible=true;
var workbook=app.Workbooks.Open(@“C:\testit.xlsx”);
_工作表=工作簿。工作表[“Sheet1”];
范围xlRange=worksheet.UsedRange;
工作表=(_工作表)workbook.ActiveSheet;
工作表.单元格[1,1]=“名字”;
工作表.单元格[1,2]=“姓氏”;
工作表.单元格[1,3]=“电子邮件”;
int行=4;
foreach(触点中的var触点)
{
行++;
worksheet.Cells[row,1]=contact.Firstname;
worksheet.Cells[row,2]=contact.Lastname;
worksheet.Cells[行,3]=contact.Email;
worksheet.Cells[行,4]=contact.PhoneNumber;
}
app.UserControl=true;
app.Quit();
}
公共类联系人
{
公共字符串名{get;set;}
公共字符串Lastname{get;set;}
公共字符串电子邮件{get;set;}
公共字符串PhoneNumber{get;set;}
}

我想补充一点,您需要小心使用此类代码。 在使用互操作性时,您需要进行更多的内存管理。 尽量在使用对象之前声明它们,然后清除它们。 在互操作代码(例如object1.object2.value)中尽量不要超过2点()

这将使:

Microsoft.Office.Interop.Excel.Range _range;
_range = worksheet.get_Range("A1", "A1");
_range.Value2 = contact.Firstname;
完成后:

Marshal.ReleaseComObject(_range);

我想补充一点,您需要小心使用这种代码。 在使用互操作性时,您需要进行更多的内存管理。 尽量在使用对象之前声明它们,然后清除它们。 在互操作代码(例如object1.object2.value)中尽量不要超过2点()

这将使:

Microsoft.Office.Interop.Excel.Range _range;
_range = worksheet.get_Range("A1", "A1");
_range.Value2 = contact.Firstname;
完成后:

Marshal.ReleaseComObject(_range);

你的答案似乎是唯一正确的:)(你的答案是+1)。但是您应该突出显示问题。@user235973457您的代码写得很好,但是您看不到它,因为您没有保存更改,也没有显示电子表格(而且您的循环是错误的)。如果您使用app.Visible=true;如此答案所示,您将看到单元格正在填充。最后,您还应该添加workbook.Save()。@Cyborgx37恐怕这与此无关