如何将一些数据写入excel文件(.xlsx)

Posted

技术标签:

【中文标题】如何将一些数据写入excel文件(.xlsx)【英文标题】:How to write some data to excel file(.xlsx) 【发布时间】:2014-04-13 09:26:56 【问题描述】:

这就是我想要做的。

1.使用名称+值(日期)创建excel文件(.xlsx)c://test/files/work1_4.13.14.xlsx

示例:work1_4.13.14.xlsx

2.为文件设置标题示例:[Name] [Age] [City]。

3.我有 3 个包含姓名、年龄、城市的列表,我需要填写到 Excel 表中。

这是我的目标

Name   Age  City
Ben    20   xyz
Jack   25   xyz
Mike   45   zyx

有什么想法吗?

【问题讨论】:

在 Gridview 中显示相同的数据,而不是使用 Export to excel form Gridview 显示相同的数据。 接受的答案已经过时了,IMO 对开发人员 atm 不利 - 如果您打算使用 office.interop.excel,那么您必须在部署的 PC 中安装 office,这是一个不必要的依赖 + 如果你忘记处理然后你会流血的记忆。还有其他库,您不需要安装 Office,而且使用起来更简单:NPOI、ClosedXml 和 EPPlus 是一些流行的替代品。我会让读者根据他们的特定需求来决定哪个是最好的,但是我会全心全意地推荐这三个中最差的 office.interop dll。 【参考方案1】:

试试这个代码

Microsoft.Office.Interop.Excel.Application oXL;
Microsoft.Office.Interop.Excel._Workbook oWB;
Microsoft.Office.Interop.Excel._Worksheet oSheet;
Microsoft.Office.Interop.Excel.Range oRng;
object misvalue = System.Reflection.Missing.Value;
try

    //Start Excel and get Application object.
    oXL = new Microsoft.Office.Interop.Excel.Application();
    oXL.Visible = true;

    //Get a new workbook.
    oWB = (Microsoft.Office.Interop.Excel._Workbook)(oXL.Workbooks.Add(""));
    oSheet = (Microsoft.Office.Interop.Excel._Worksheet)oWB.ActiveSheet;

    //Add table headers going cell by cell.
    oSheet.Cells[1, 1] = "First Name";
    oSheet.Cells[1, 2] = "Last Name";
    oSheet.Cells[1, 3] = "Full Name";
    oSheet.Cells[1, 4] = "Salary";

    //Format A1:D1 as bold, vertical alignment = center.
    oSheet.get_Range("A1", "D1").Font.Bold = true;
    oSheet.get_Range("A1", "D1").VerticalAlignment =
        Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;

    // Create an array to multiple values at once.
    string[,] saNames = new string[5, 2];

    saNames[0, 0] = "John";
    saNames[0, 1] = "Smith";
    saNames[1, 0] = "Tom";

    saNames[4, 1] = "Johnson";

    //Fill A2:B6 with an array of values (First and Last Names).
    oSheet.get_Range("A2", "B6").Value2 = saNames;

    //Fill C2:C6 with a relative formula (=A2 & " " & B2).
    oRng = oSheet.get_Range("C2", "C6");
    oRng.Formula = "=A2 & \" \" & B2";

    //Fill D2:D6 with a formula(=RAND()*100000) and apply format.
    oRng = oSheet.get_Range("D2", "D6");
    oRng.Formula = "=RAND()*100000";
    oRng.NumberFormat = "$0.00";

    //AutoFit columns A:D.
    oRng = oSheet.get_Range("A1", "D1");
    oRng.EntireColumn.AutoFit();

    oXL.Visible = false;
    oXL.UserControl = false;
    oWB.SaveAs("c:\\test\\test505.xls", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing,
        false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
        Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

    oWB.Close();
    oXL.Quit();

    //...

【讨论】:

它工作得很好,但有没有可能在不打开 Excel 的情况下做到这一点?直接写入文件?因为它非常慢(写入 100k 值)..而且我有一种感觉,瓶颈是 excel 本身 我非常感谢你的回答,对我帮助很大。 @Lonefish 晚了 2 年,但这是可能的。检查我刚刚发布的答案 我必须为 Microsoft.Office.Interop.Excel 添加参考。这里有很好的解释***.com/a/47881824/5733842【参考方案2】:

您可以为此使用ClosedXML。

将您的表格存储在 DataTable 中,您可以通过这个简单的 sn-p 将表格导出到 excel:

XLWorkbook workbook = new XLWorkbook();
DataTable table = GetYourTable();
workbook.Worksheets.Add(table );

您可以阅读 ClosedXML 的文档以了解更多信息。希望这可以帮助!

【讨论】:

非常适合新数据,但缺点是 ClosedXML 缺乏更新或替换现有工作表中数据的智能。一个常见的用例是从模板开始并将数据应用到它;如果 ClosedXML 有任何有意义的东西,比如图表,它可能会破坏模板。【参考方案3】:

希望这正是我们正在寻找的。​​p>

private void button2_Click(object sender, RoutedEventArgs e)

    UpdateExcel("Sheet3", 4, 7, "Namachi@gmail");


private void UpdateExcel(string sheetName, int row, int col, string data)

    Microsoft.Office.Interop.Excel.Application oXL = null;
    Microsoft.Office.Interop.Excel._Workbook oWB = null;
    Microsoft.Office.Interop.Excel._Worksheet oSheet = null;

    try
    
        oXL = new Microsoft.Office.Interop.Excel.Application();
        oWB = oXL.Workbooks.Open("d:\\MyExcel.xlsx");
        oSheet = String.IsNullOrEmpty(sheetName) ? (Microsoft.Office.Interop.Excel._Worksheet)oWB.ActiveSheet : (Microsoft.Office.Interop.Excel._Worksheet)oWB.Worksheets[sheetName];

        oSheet.Cells[row, col] = data;

        oWB.Save();

        MessageBox.Show("Done!");
    
    catch (Exception ex)
    
        MessageBox.Show(ex.ToString());
    
    finally
    
        if (oWB != null)
        oWB.Close();
    

【讨论】:

【参考方案4】:

可以在不使用Microsoft.Jet.OLEDB.4.0OleDb 打开的情况下写入excel 文件。使用OleDb,它的行为就像您正在使用 sql 写入表一样。

这是我用来创建和写入新 Excel 文件的代码。不需要额外的参考

var connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\SomePath\ExcelWorkBook.xls;Extended Properties=Excel 8.0";
using (var excelConnection = new OleDbConnection(connectionString))

    // The excel file does not need to exist, opening the connection will create the
    // excel file for you
    if (excelConnection.State != ConnectionState.Open)  excelConnection.Open(); 

    // data is an object so it works with DBNull.Value
    object propertyOneValue = "cool!";
    object propertyTwoValue = "testing";

    var sqlText = "CREATE TABLE YourTableNameHere ([PropertyOne] VARCHAR(100), [PropertyTwo] INT)";

    // Executing this command will create the worksheet inside of the workbook
    // the table name will be the new worksheet name
    using (var command = new OleDbCommand(sqlText, excelConnection))  command.ExecuteNonQuery(); 

    // Add (insert) data to the worksheet
    var commandText = $"Insert Into YourTableNameHere ([PropertyOne], [PropertyTwo]) Values (@PropertyOne, @PropertyTwo)";

    using (var command = new OleDbCommand(commandText, excelConnection))
    
        // We need to allow for nulls just like we would with
        // sql, if your data is null a DBNull.Value should be used
        // instead of null 
        command.Parameters.AddWithValue("@PropertyOne", propertyOneValue ?? DBNull.Value);
        command.Parameters.AddWithValue("@PropertyTwo", propertyTwoValue ?? DBNull.Value);

        command.ExecuteNonQuery();
    

【讨论】:

问题在于使用 ODEDB 时将达到 255 个字符的限制。【参考方案5】:

最近试了npoi,很简单。

根据要求,让我们编写将数据输出到work1_4.13.14.xlsx 文件的代码,例如:

Name   Age  City
Ben    20   xyz
Jack   25   xyz
Mike   45   zyx

这是代码

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;

namespace ExcelWriter

    class Program
    
        static void Main(string[] args)
        
            IWorkbook workbook = new XSSFWorkbook();
            ISheet sheet1 = workbook.CreateSheet("Sheet1");

            IRow row1 = sheet1.CreateRow(0);
            row1.CreateCell(0).SetCellValue("Name");
            row1.CreateCell(1).SetCellValue("Age");
            row1.CreateCell(2).SetCellValue("City");

            IRow row2 = sheet1.CreateRow(1);
            row2.CreateCell(0).SetCellValue("Ben");
            row2.CreateCell(1).SetCellValue("20");
            row2.CreateCell(2).SetCellValue("xyz");

            IRow row3 = sheet1.CreateRow(2);
            row3.CreateCell(0).SetCellValue("Jack");
            row3.CreateCell(1).SetCellValue("25");
            row3.CreateCell(2).SetCellValue("xyz");

            IRow row4 = sheet1.CreateRow(3);
            row4.CreateCell(0).SetCellValue("Mike");
            row4.CreateCell(1).SetCellValue("45");
            row4.CreateCell(2).SetCellValue("zyx");

            FileStream sw = File.Create("work1_4.13.14.xlsx");
            workbook.Write(sw);
            sw.Close();
        
    


我没有使用循环只是为了让初学者更容易理解。

.CreateRow(int index) 在指定索引处创建新行。row.CreateCell(int index) 在行中指定索引处创建新单元格。cell.SetCellValue(string value) 在行索引处设置值。

了解详情:

Nuget:https://www.nuget.org/packages/NPOI 代码:https://github.com/nissl-lab/npoi 示例:https://github.com/nissl-lab/npoi-examples

【讨论】:

【参考方案6】:

只需按照以下步骤操作:

//启动Excel,获取Application对象。

oXL = new Microsoft.Office.Interop.Excel.Application();

oXL.Visible = false;

【讨论】:

以上是关于如何将一些数据写入excel文件(.xlsx)的主要内容,如果未能解决你的问题,请参考以下文章

R语言write.xlsx函数将数据写入Excel文件:写入Excel文件并自定义表单的名称将数据写入Excel文件新的表单(sheet)中将文件保存为xls文件格式(而不是xlsx)

使用write.xlsx将数据框写入R中的excel时如何以粗体打印顶行

如何使用Java创建Excel(.xls 和 .xlsx)文件 并写入数据

如何将 JSON **text** 写入 Excel 文件?

js-xlsx实现文件导出下载(excel)

R语言使用write_xlsx函数导出写入dataframe数据到excel文件实战