这就是我想要做的。
1.创建excel文件(.xlsx)c://test/files/work1_4.13.14.xlsx,名称为+值(日期)
示例:work1_4.13.14.xlsx
2.将标题设置为文件示例:[名称] [年龄] [城市]。
3.我有3个名单,年龄,城市,我需要填写excel表。
这是我的目标
Name Age City
Ben 20 xyz
Jack 25 xyz
Mike 45 zyx
有什么想法吗?
答案 0 :(得分:94)
试试此代码
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();
//...
答案 1 :(得分:21)
您可以使用ClosedXML。
将您的表存储在DataTable中,您可以通过这个简单的代码段将表导出到excel:
XLWorkbook workbook = new XLWorkbook();
DataTable table = GetYourTable();
workbook.Worksheets.Add(table );
您可以阅读ClosedXML的文档以了解更多信息。希望这可以帮助!
答案 2 :(得分:10)
希望这是我们正在寻找的确切内容。
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();
}
}
答案 3 :(得分:10)
可以使用Microsoft.Jet.OLEDB.4.0
和OleDb
在不打开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();
}
}
答案 4 :(得分:0)
最近,我尝试了 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
答案 5 :(得分:-2)
按照以下步骤操作:
//启动Excel并获取Application对象。
oXL = new Microsoft.Office.Interop.Excel.Application();
oXL.Visible = false;