C#导入、导出EXCEL方法整理
方法一、使用using System.Data.OleDb(该方法将EXCEL视同数据库,采用命令+参数的操作方式,使用时需要安装office或EXCEL驱动)
1、使用的命名空间为:using System.Data.OleDb;
* 2 连接数据库的字符串为:string myConn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\目录.xls;Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\"";
* *.xsl可以认为是数据库了,HDR表示是否隐藏excel的第一行(因为第一行一般表示字段名称)
* IMEX 参数,因为不同的模式代表著不同的读写行为:当IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。
* 当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途
#region elxe数据导入数据库 /// <summary> /// Excel数据导入Datable /// </summary> /// <param name="fileUrl">Excel文件完全路径</param> /// <param name="Sheet">要查找的表单名,为空返回第一个表单</param> /// <returns></returns> static public DataTable GetExcelDatatable(string fileUrl, string Sheet) { OpenFileDialog dialog = new OpenFileDialog(); string file = ""; if (fileUrl != "") file = fileUrl; else { dialog.Multiselect = true; //该值确定是否可以选择多个文件 dialog.Title = "请选择文件夹"; dialog.Filter = "所有文件(*.*)|*.*"; if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { file = dialog.FileName; } else { return null; } } //office2007之前 仅支持.xls //const string cmdText = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;IMEX=1';"; //支持.xls和.xlsx,即包括office2010等版本的 HDR=Yes代表第一行是标题,不是数据; const string cmdText = "Provider=Microsoft.Ace.OleDb.12.0;Data Source={0};Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'"; DataTable dt = null; //建立连接(程序与Excel文件) if (file == "" | !File.Exists(file)) { MessageBox.Show("未选择文件或指定文件不存在!", "软件提示"); return null; } OleDbConnection conn = new OleDbConnection(string.Format(cmdText, file)); try { //打开连接 if (conn.State == ConnectionState.Broken || conn.State == ConnectionState.Closed) { conn.Open(); } //获取Excel的所有表单 DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); //获取Excel的第一个Sheet名称 string sheetName = ""; if (Sheet != "") sheetName = Sheet + "$"; else sheetName = schemaTable.Rows[0]["TABLE_NAME"].ToString().Trim(); //查询sheet中的数据 string strSql = "select * from [" + sheetName + "]"; OleDbDataAdapter da = new OleDbDataAdapter(strSql, conn); DataSet ds = new DataSet(); da.Fill(ds, "mapTable"); dt = ds.Tables[0]; return dt; } catch (Exception exc) { throw exc; } finally { conn.Close(); conn.Dispose(); } } /// <summary> /// 判断数据库表是否存在。 /// </summary> /// <param name="tablename">bhtsoft表</param> /// <returns></returns> public static bool CheckExistsTable(string tablename) { SQLiteCommand mDbCmd = conn.CreateCommand(); mDbCmd.CommandText = "SELECT COUNT(*) FROM sqlite_master where type='table' and name='" + tablename + "';"; if (0 == Convert.ToInt32(mDbCmd.ExecuteScalar())) { return false; } else { return true; } } /// <summary> /// 查找数据库表、生成带参数指令,批量修改数据 /// </summary> /// <param name="tbName">数据库表名</param> /// <param name="rowName">要操作的字段集</param> /// <param name="rowValue">要操作字段的值</param> /// <returns></returns> static public int SqlCmd(string tbName, string[] rowName, string[] rowValue) { conn.Open(); string sqlInsert = "insert into " + tbName; string cmdstrA = ""; int a = 0; if (!CheckExistsTable(tbName)) { MessageBox.Show("数据库中不存在对应表单!", "软件提示"); return a; } //向SQL指令中添加字段项 string sqlInsertA = "("; for (int i = 0; i < rowName.Count(); i++) { sqlInsertA += rowName[i]; if (i == rowName.Count() - 1) { sqlInsertA += ")"; break; } sqlInsertA += ","; } //向SQL指令中添加字段值 string sqlInsertB = " VALUES("; for (int i = 0; i < rowName.Count(); i++) { sqlInsertB += "@" + rowName[i]; if (i == rowName.Count() - 1) { sqlInsertB += ")"; break; } sqlInsertB += ","; } cmdstrA = sqlInsert + sqlInsertA + sqlInsertB; //生成SQL指令参数 my_Cmd.Parameters.Clear(); for (int i = 0; i < rowName.Count(); i++) { my_Cmd.Parameters.AddWithValue("@" + rowName[i].ToString(), rowValue[i].Trim()); } try { if (conn.State == ConnectionState.Open & cmdstrA != "") { a = ExecDataBySql(cmdstrA); } } catch (SqlException ex)//捕获数据库异常 { MessageBox.Show(ex.ToString());//输出异常信息 } finally { conn.Close();//关闭数据库连接 } return a; } /// <summary> /// elxe数据导入数据库 /// </summary> /// <param name="elxeName">要导入的elxe表名</param> /// <param name="dbTableName"></param> /// <returns></returns> static public int InsetData(string elxeName, string dbTableName) { OpenFileDialog dialog = new OpenFileDialog(); string file = ""; if (elxeName != "") file = elxeName; else { dialog.Multiselect = true; //该值确定是否可以选择多个文件 dialog.Title = "请选择文件夹"; dialog.Filter = "所有文件(*.*)|*.*"; if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { file = dialog.FileName; } else { return 0; } } DataTable dt = null; //建立连接(程序与Excel文件) if (file == "" | !File.Exists(file)) { MessageBox.Show("未选择文件或指定文件不存在!", "软件提示"); return 0; } //string elxeNameA = ""; //if (elxeName != "") // elxeNameA = path + elxeName; //DataTable dt = GetExcelDatatable(elxeNameA, dbTableName);//path + @"\ExcelToDB.xlsx" dt = Import(file); int a = 0; if (dt == null) { MessageBox.Show("数据读取失败!", "软件提示"); return a; } string[] rowName = new string[dt.Columns.Count]; string[] rowValue = new string[dt.Columns.Count]; string sqlDelete = "Delete from " + dbTableName; //删除原数据 ExecDataBySql(sqlDelete); //变量内存表中的所有行 foreach (DataRow dr in dt.Rows) { try { for (int i = 0; i < dt.Columns.Count; i++) { rowName[i] = dt.Columns[i].ColumnName; rowValue[i] = dr.ItemArray[i].ToString(); } a = SqlCmd(dbTableName, rowName, rowValue); if (a <= 0) { MessageBox.Show("数据库表单修改失败!", "软件提示"); return a; } } catch (Exception ex) { throw ex; } } if (a > 0) MessageBox.Show("数据导入完成!", "软件提示"); return a; } #endregion #region 导出数据到EXCEL static OleDbConnection ExConn; static string connString; static string FileName = path; static string SheetName = "Sheet1"; /// <summary> /// 打开连接 /// </summary> static private void Open(string FileName) { if (ExConn == null) { //在此处设置访问的数据库文件 connString = "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" + FileName + ";Extended Properties='Excel 12.0; IMEX=0'"; //connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileName + ";Extended Properties=Excel 8.0; IMEX=2'"; ExConn = new OleDbConnection(connString); ExConn.Open(); } else if (ExConn.State == System.Data.ConnectionState.Closed) ExConn.Open(); } /// <summary> /// 关闭连接 /// </summary> static public void Close() { if (ExConn != null) ExConn.Close(); } private void Choosepath() { SaveFileDialog SaveFile = new SaveFileDialog(); //SaveFile.FileName = saveFileName; //设置文件类型 SaveFile.Filter = "Miscrosoft Office Excel 97-2003 工作表|*.xls|所有文件(*.*)|*.*"; //设置默认文件类型显示顺序 SaveFile.FilterIndex = 1; //保存对话框是否记忆上次打开的目录 SaveFile.RestoreDirectory = true; if (SaveFile.ShowDialog() == DialogResult.OK) { string localFilePath = SaveFile.FileName.ToString(); //获得文件路径 string fileNameExt = localFilePath.Substring(localFilePath.LastIndexOf("\\") + 1); //获取文件名,不带路径 DataBase.ImportData(DataBase.Sqlcmd_Datareader("SELECT * FROM tb_CGQ"), fileNameExt, "tb_CGQ"); System.Windows.MessageBox.Show("导出数据成功!", "系统信息"); //获取文件路径,不带文件名 //FilePath = localFilePath.Substring(0, localFilePath.LastIndexOf("\\")); //给文件名前加上时间 //newFileName = DateTime.Now.ToString("yyyyMMdd") + fileNameExt; //在文件名里加字符 //saveFileDialog1.FileName.Insert(1,"dameng"); //System.IO.FileStream fs = (System.IO.FileStream)sfd.OpenFile();//输出文件 } } /// <summary> /// 导入数据到Excel /// </summary> /// <param name="OutTable"></param> static public void ImportData(DataTable OutTable, string FileName, string SheetName) { SaveFileDialog SaveFile = new SaveFileDialog(); string localFilePath="", fileNameExt="", newFileName="", FilePath=""; //设置文件类型 SaveFile.Filter = "Miscrosoft Office Excel 97-2003 工作表|*.xls|Miscrosoft Office Excel 2007 工作表|*.xlsx|所有文件(*.*)|*.*"; //设置默认文件类型显示顺序 SaveFile.FilterIndex = 1; //保存对话框是否记忆上次打开的目录 SaveFile.RestoreDirectory = true; //设置默认文件名 SaveFile.FileName = FileName; if (SaveFile.ShowDialog() == DialogResult.OK) { localFilePath = SaveFile.FileName.ToString(); //获得文件路径 fileNameExt = localFilePath.Substring(localFilePath.LastIndexOf("\\") + 1); //获取文件名,不带路径 // DataBase.ImportData(DataBase.Sqlcmd_Datareader("SELECT * FROM tb_CGQ"), fileNameExt, "tb_CGQ"); System.Windows.MessageBox.Show("导出数据成功!", "系统信息"); //获取文件路径,不带文件名 FilePath = localFilePath.Substring(0, localFilePath.LastIndexOf("\\")); // SaveFile.DefaultExt //给文件名前加上时间 //newFileName = DateTime.Now.ToString("yyyyMMdd") + fileNameExt; //在文件名里加字符 //saveFileDialog1.FileName.Insert(1,"dameng"); //System.IO.FileStream fs = (System.IO.FileStream)sfd.OpenFile();//输出文件 } StringBuilder sb = new StringBuilder(); //sb.Append(localFilePath); //sb.Append(@"\"); //sb.Append(fileNameExt); //sb.Append(".xlsx"); CreateExcel(OutTable, localFilePath.ToString(), SheetName); InsertData(OutTable, localFilePath.ToString(), SheetName); } /// <summary> /// 创建Excel文件和表头 /// </summary> static private void CreateExcel(DataTable OutTable, string FileName, string SheetName) { //我们常常碰到字符串连接的情况,方便和直接的方式是通过"+"符号来实现, //但是这种方式达到目的的效率比较低,且每执行一次都会创建一个String对象 //即耗时,又浪费空间。使用StringBuilder类就可以避免这种问题的发生 StringBuilder sb = new StringBuilder(); if (File.Exists(FileName)) { File.Delete(FileName); } sb.Append("create table "); sb.Append(SheetName); sb.Append("("); //遍历所有列 foreach (DataColumn col in OutTable.Columns) { //创建列:列名+数据类型 sb.Append(col.ColumnName + " varchar,"); } //移除最后一个,号 sb.Remove(sb.Length - 1, 1); sb.Append(")"); Open(FileName); //创建SQL语句执行类 OleDbCommand OleCmd = new OleDbCommand(); OleCmd.Connection = ExConn;//创建连接 OleCmd.CommandText = sb.ToString();//解析指令字符串 OleCmd.ExecuteNonQuery();//执行指令 Close(); } /// <summary> /// 插入数据 /// </summary> static private void InsertData(DataTable OutTable, string FileName, string SheetName) { OleDbCommand OleCmd = new OleDbCommand(); //创建OleDbCommand指令参数集 OleDbParameter[] parm = new OleDbParameter[OutTable.Columns.Count]; StringBuilder sb = new StringBuilder(); sb.Append("insert into "); sb.Append(SheetName); sb.Append(" values("); for (int i = 0; i < OutTable.Columns.Count; i++) { parm[i] = new OleDbParameter("@P" + OutTable.Columns[i].ColumnName, OleDbType.VarChar); sb.Append("@P" + OutTable.Columns[i].ColumnName + ","); OleCmd.Parameters.Add(parm[i]); } sb.Remove(sb.Length - 1, 1); sb.Append(")"); Open(FileName); OleCmd.Connection = ExConn; OleCmd.CommandText = sb.ToString(); foreach (DataRow row in OutTable.Rows) { for (int i = 0; i < OutTable.Columns.Count; i++) { parm[i].Value = row[i].ToString().Trim(); } OleCmd.ExecuteNonQuery(); } Close(); } /// <summary> /// 从Excel输出数据到数据集 /// </summary> /// <returns></returns> public DataSet OutPortData() { DataSet ds = new DataSet(); Open(FileName); OleDbDataAdapter myAdapter = new OleDbDataAdapter("select * from [Sheet1$]", ExConn); myAdapter.Fill(ds, "Input"); Close(); return ds; } #endregion
方法二:将Excle作为一个文件来处理
这种方法与文本文件及其他文件的处理方法一样,安装标准的类库调用对应的方法
这种方法使用时有一定局限性,要安装与引用库类相同版本的office或EXCEL驱动,且还要区分32位和64位系统
#region 生成Excle文件并保存到指定位置常规方式 /// <summary> /// winform生成Excle文件并保存到指定位置 /// </summary> /// <param name="dt">数据源</param> /// <param name="saveFileName">生成Excel文件名</param> public void ExportToExcel(DataTable dt, string saveFileName) { if (dt == null) return; Excel.Application xlApp = new Excel.Application(); if (xlApp == null) { // lblMsg.Text = "无法创建Excel对象,可能您的机子未安装Excel"; MessageBox.Show("请确保您的电脑已经安装Excel", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } Excel.Workbooks workbooks = xlApp.Workbooks; Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet); Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1]; //取得sheet1 Excel.Range range = null; long totalCount = dt.Rows.Count; long rowRead = 0; float percent = 0; //写入标题 for (int i = 0; i < dt.Columns.Count; i++) { worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName; range = (Excel.Range)worksheet.Cells[1, i + 1]; //range.Interior.ColorIndex = 15;//背景颜色 range.Font.Bold = true; //粗体 range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; //居中 //加边框 range.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, null); //range.ColumnWidth = 4.63;//设置列宽 //range.EntireColumn.AutoFit();//自动调整列宽 //r1.EntireRow.AutoFit();//自动调整行高 } //写入内容 for (int r = 0; r < dt.Rows.Count; r++) { for (int i = 0; i < dt.Columns.Count; i++) { try { worksheet.Cells[r + 2, i + 1] = dt.Rows[r][i]; range = (Excel.Range)worksheet.Cells[r + 2, i + 1]; range.Font.Size = 9; //字体大小 //加边框 range.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, null); range.EntireColumn.AutoFit(); //自动调整列宽 } catch (Exception) { } } rowRead++; percent = ((float)(100 * rowRead)) / totalCount; Application.DoEvents(); } range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].Weight = Excel.XlBorderWeight.xlThin; if (dt.Columns.Count > 1) { range.Borders[Excel.XlBordersIndex.xlInsideVertical].Weight = Excel.XlBorderWeight.xlThin; } try { workbook.Saved = true; SaveFileDialog SaveFile = new SaveFileDialog(); SaveFile.FileName = saveFileName; SaveFile.Filter = "Miscrosoft Office Excel 97-2003 工作表|*.xls|所有文件(*.*)|*.*"; SaveFile.RestoreDirectory = true; if (SaveFile.ShowDialog() == DialogResult.OK) { workbook.SaveCopyAs(SaveFile.FileName); MessageBox.Show("导出数据成功!", "系统信息"); } } catch (Exception ex) { MessageBox.Show("导出文件时出错,文件可能正被打开!", "系统信息"); } workbooks.Close(); if (xlApp != null) { xlApp.Workbooks.Close(); xlApp.Quit(); int generation = GC.GetGeneration(xlApp); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); xlApp = null; GC.Collect(generation); } GC.Collect(); //强行销毁 #region 强行杀死最近打开的Excel进程 System.Diagnostics.Process[] excelProc = System.Diagnostics.Process.GetProcessesByName("EXCEL"); DateTime startTime = new DateTime(); int m, killId = 0; for (m = 0; m < excelProc.Length; m++) { if (startTime < excelProc[m].StartTime) { startTime = excelProc[m].StartTime; killId = m; } } if (excelProc[killId].HasExited == false) { excelProc[killId].Kill(); } #endregion } #endregion
方法三;使用第三方插件NPOI
次插件可以以简单方式直接导出数据,也可以调用其中包括的方法以模块方式导出,代码都比较简单
最重要的是使用时不需要安装office或EXCEL驱动,编译后生成的EXE文件可在任何环境运行
#region 使用NPOI导出 /// <summary> /// DataTable导出到Excel文件 /// </summary> /// <param name="dtSource">源DataTable</param> /// <param name="strHeaderText">表头文本</param> /// <param name="strFileName">保存位置</param> /// <param name="strSheetName">工作表名称</param> /// <Author>CallmeYhz 2015-11-26 10:13:09</Author> public static void Export(DataTable dtSource, string strHeaderText, string strSheetName) { if (strSheetName == "") { strSheetName = "Sheet"; } #region 选择文件保存路径和文件名 SaveFileDialog SaveFile = new SaveFileDialog(); string localFilePath = ""; string[] oldColumnNames; string[] newColumnNames; if (dtSource == null) { System.Windows.MessageBox.Show("为找到要导出的数据表!", "系统信息"); return; } oldColumnNames = new string[dtSource.Columns.Count]; for (int i = 0; i < dtSource.Columns.Count; i++) { oldColumnNames[i]= dtSource.Columns[i].ColumnName.ToString(); } newColumnNames = oldColumnNames; //设置文件类型 SaveFile.Filter = "Miscrosoft Office Excel 97-2003 工作表|*.xls|Miscrosoft Office Excel 2007 工作表|*.xlsx|所有文件(*.*)|*.*"; //设置默认文件类型显示顺序 SaveFile.FilterIndex = 1; //保存对话框是否记忆上次打开的目录 SaveFile.RestoreDirectory = true; //设置默认文件名 SaveFile.FileName = FileName; if (SaveFile.ShowDialog() == DialogResult.OK) { //获取文件路径,带文件名 localFilePath = SaveFile.FileName.ToString(); //获得文件路径 using (MemoryStream ms = Export(dtSource, strHeaderText, strSheetName, oldColumnNames, newColumnNames)) { using (FileStream fs = new FileStream(localFilePath, FileMode.Create, FileAccess.Write)) { byte[] data = ms.ToArray(); fs.Write(data, 0, data.Length); fs.Flush(); } } System.Windows.MessageBox.Show("导出数据成功!", "系统信息"); } #endregion } /// <summary> /// DataTable导出到Excel的MemoryStream /// MemoryStream:文件流模板,可作为直接导入Excel的数据源 /// </summary> /// <param name="dtSource">源DataTable</param> /// <param name="strHeaderText">表头文本</param> /// <param name="strSheetName">工作表名称</param> /// <Author>CallmeYhz 2015-11-26 10:13:09</Author> public static MemoryStream Export(DataTable dtSource, string strHeaderText, string strSheetName, string[] oldColumnNames, string[] newColumnNames) { if (oldColumnNames.Length != newColumnNames.Length) { return new MemoryStream(); } HSSFWorkbook workbook = new HSSFWorkbook();//创建工作簿 //HSSFSheet sheet = workbook.CreateSheet();// workbook.CreateSheet(); ISheet sheet = workbook.CreateSheet(strSheetName);//创建工作表 #region 右击文件 属性信息 { DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation(); dsi.Company = "NPOI"; workbook.DocumentSummaryInformation = dsi; SummaryInformation si = PropertySetFactory.CreateSummaryInformation(); si.Author = "文件作者信息"; //填加xls文件作者信息 si.ApplicationName = "创建程序信息"; //填加xls文件创建程序信息 si.LastAuthor = "最后保存者信息"; //填加xls文件最后保存者信息 si.Comments = "作者信息"; //填加xls文件作者信息 si.Title = "标题信息"; //填加xls文件标题信息 si.Subject = "主题信息";//填加文件主题信息 si.CreateDateTime = DateTime.Now; workbook.SummaryInformation = si; } #endregion ICellStyle dateStyle = workbook.CreateCellStyle(); IDataFormat format = workbook.CreateDataFormat(); dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd"); #region 取得列宽 //int[] arrColWidth = new int[oldColumnNames.Length]; //for (int i = 0; i < oldColumnNames.Length; i++) //{ // arrColWidth[i] = Encoding.GetEncoding(936).GetBytes(newColumnNames[i]).Length; //} /* foreach (DataColumn item in dtSource.Columns) { arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length; } * */ for (int i = 0; i < dtSource.Rows.Count; i++) { //for (int j = 0; j < oldColumnNames.Length; j++) //{ // int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][oldColumnNames[j]].ToString()).Length; // if (intTemp > arrColWidth[j]) // { // arrColWidth[j] = intTemp; // } //} /* for (int j = 0; j < dtSource.Columns.Count; j++) { int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length; if (intTemp > arrColWidth[j]) { arrColWidth[j] = intTemp; } } * */ } #endregion int rowIndex = 0; //遍历DataTable表所有列 foreach (DataRow row in dtSource.Rows) { #region 新建表,填充表头,填充列头,样式 if (rowIndex == 65535 || rowIndex == 0) { if (rowIndex != 0) { sheet = workbook.CreateSheet(strSheetName + ((int)rowIndex / 65535).ToString()); } #region 表头及样式 { IRow headerRow = sheet.CreateRow(0); headerRow.HeightInPoints = 25; headerRow.CreateCell(0).SetCellValue(strHeaderText); ICellStyle headStyle = workbook.CreateCellStyle(); headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; IFont font = workbook.CreateFont(); font.FontHeightInPoints = 20; font.Boldweight = 700; headStyle.SetFont(font); headerRow.GetCell(0).CellStyle = headStyle; //sheet.AddMergedRegion(new Region(0, 0, 0, dtSource.Columns.Count - 1)); sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1)); } #endregion #region 列头及样式 { //HSSFRow headerRow = sheet.CreateRow(1); IRow headerRow = sheet.CreateRow(1); ICellStyle headStyle = workbook.CreateCellStyle(); headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; IFont font = workbook.CreateFont(); font.FontHeightInPoints = 10; font.Boldweight = 700; headStyle.SetFont(font); for (int i = 0; i < oldColumnNames.Length; i++) { headerRow.CreateCell(i).SetCellValue(newColumnNames[i]); headerRow.GetCell(i).CellStyle = headStyle; //设置列宽 //sheet.SetColumnWidth(i, (arrColWidth[i] + 1) * 256); } /* foreach (DataColumn column in dtSource.Columns) { headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); headerRow.GetCell(column.Ordinal).CellStyle = headStyle; //设置列宽 sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); } * */ } #endregion rowIndex = 2; } #endregion #region 填充内容 IRow dataRow = sheet.CreateRow(rowIndex); //foreach (DataColumn column in dtSource.Columns) for (int i = 0; i < oldColumnNames.Length; i++) { ICell newCell = dataRow.CreateCell(i); string drValue = row[oldColumnNames[i]].ToString(); switch (dtSource.Columns[oldColumnNames[i]].DataType.ToString()) { case "System.String"://字符串类型 newCell.SetCellValue(drValue); break; case "System.DateTime"://日期类型 DateTime dateV; DateTime.TryParse(drValue, out dateV); newCell.SetCellValue(dateV); newCell.CellStyle = dateStyle;//格式化显示 break; case "System.Boolean"://布尔型 bool boolV = false; bool.TryParse(drValue, out boolV); newCell.SetCellValue(boolV); break; case "System.Int16"://整型 case "System.Int32": case "System.Int64": case "System.Byte": int intV = 0; int.TryParse(drValue, out intV); newCell.SetCellValue(intV); break; case "System.Decimal"://浮点型 case "System.Double": double doubV = 0; double.TryParse(drValue, out doubV); newCell.SetCellValue(doubV); break; case "System.DBNull"://空值处理 newCell.SetCellValue(""); break; default: newCell.SetCellValue(""); break; } } #endregion rowIndex++; } using (MemoryStream ms = new MemoryStream()) { workbook.Write(ms); ms.Flush(); ms.Position = 0; //sheet.Dispose(); sheet = null; workbook = null; //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet return ms; } } /// <summary> /// DataTable导出到Excel文件(无表头)另外的是有表头的 /// </summary> /// <param name="dtSource">源DataTable</param> /// <param name="strHeaderText">表头文本</param> /// <param name="strFileName">保存位置</param> /// <param name="strSheetName">工作表名称</param> /// <Author>CallmeYhz 2015-11-26 10:13:09</Author> public static void MyExport(DataTable dtSource, string strHeaderText, string strFileName, string strSheetName, string[] oldColumnNames, string[] newColumnNames) { if (strSheetName == "") { strSheetName = "Sheet"; } MemoryStream getms = new MemoryStream(); #region 为getms赋值 if (oldColumnNames.Length != newColumnNames.Length) { getms = new MemoryStream(); } HSSFWorkbook workbook = new HSSFWorkbook(); //HSSFSheet sheet = workbook.CreateSheet();// workbook.CreateSheet(); ISheet sheet = workbook.CreateSheet(strSheetName); #region 右击文件 属性信息 { DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation(); dsi.Company = "NPOI"; workbook.DocumentSummaryInformation = dsi; SummaryInformation si = PropertySetFactory.CreateSummaryInformation(); si.Author = "文件作者信息"; //填加xls文件作者信息 si.ApplicationName = "创建程序信息"; //填加xls文件创建程序信息 si.LastAuthor = "最后保存者信息"; //填加xls文件最后保存者信息 si.Comments = "作者信息"; //填加xls文件作者信息 si.Title = "标题信息"; //填加xls文件标题信息 si.Subject = "主题信息";//填加文件主题信息 si.CreateDateTime = DateTime.Now; workbook.SummaryInformation = si; } #endregion ICellStyle dateStyle = workbook.CreateCellStyle(); //HSSFCellStyle dateStyle = workbook.CreateCellStyle(); IDataFormat format = workbook.CreateDataFormat(); dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd"); #region 取得列宽 int[] arrColWidth = new int[oldColumnNames.Length]; for (int i = 0; i < oldColumnNames.Length; i++) { arrColWidth[i] = Encoding.GetEncoding(936).GetBytes(newColumnNames[i]).Length; } /* foreach (DataColumn item in dtSource.Columns) { arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length; } * */ for (int i = 0; i < dtSource.Rows.Count; i++) { for (int j = 0; j < oldColumnNames.Length; j++) { int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][oldColumnNames[j]].ToString()).Length; if (intTemp > arrColWidth[j]) { arrColWidth[j] = intTemp; } } /* for (int j = 0; j < dtSource.Columns.Count; j++) { int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length; if (intTemp > arrColWidth[j]) { arrColWidth[j] = intTemp; } } * */ } #endregion int rowIndex = 0; foreach (DataRow row in dtSource.Rows) { #region 新建表,填充表头,填充列头,样式 if (rowIndex == 65535 || rowIndex == 0) { if (rowIndex != 0) { sheet = workbook.CreateSheet(strSheetName + ((int)rowIndex / 65535).ToString()); } #region 列头及样式 { //HSSFRow headerRow = sheet.CreateRow(1); IRow headerRow = sheet.CreateRow(0); ICellStyle headStyle = workbook.CreateCellStyle(); headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; IFont font = workbook.CreateFont(); font.FontHeightInPoints = 10; font.Boldweight = 700; headStyle.SetFont(font); for (int i = 0; i < oldColumnNames.Length; i++) { headerRow.CreateCell(i).SetCellValue(newColumnNames[i]); headerRow.GetCell(i).CellStyle = headStyle; //设置列宽 sheet.SetColumnWidth(i, (arrColWidth[i] + 1) * 256); } /* foreach (DataColumn column in dtSource.Columns) { headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); headerRow.GetCell(column.Ordinal).CellStyle = headStyle; //设置列宽 sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); } * */ } #endregion rowIndex = 1; } #endregion #region 填充内容 IRow dataRow = sheet.CreateRow(rowIndex); //foreach (DataColumn column in dtSource.Columns) for (int i = 0; i < oldColumnNames.Length; i++) { ICell newCell = dataRow.CreateCell(i); string drValue = row[oldColumnNames[i]].ToString(); switch (dtSource.Columns[oldColumnNames[i]].DataType.ToString()) { case "System.String"://字符串类型 newCell.SetCellValue(drValue); break; case "System.DateTime"://日期类型 DateTime dateV; DateTime.TryParse(drValue, out dateV); newCell.SetCellValue(dateV); newCell.CellStyle = dateStyle;//格式化显示 break; case "System.Boolean"://布尔型 bool boolV = false; bool.TryParse(drValue, out boolV); newCell.SetCellValue(boolV); break; case "System.Int16"://整型 case "System.Int32": case "System.Int64": case "System.Byte": int intV = 0; int.TryParse(drValue, out intV); newCell.SetCellValue(intV); break; case "System.Decimal"://浮点型 case "System.Double": double doubV = 0; double.TryParse(drValue, out doubV); newCell.SetCellValue(doubV); break; case "System.DBNull"://空值处理 newCell.SetCellValue(""); break; default: newCell.SetCellValue(""); break; } } #endregion rowIndex++; } using (MemoryStream ms = new MemoryStream()) { workbook.Write(ms); ms.Flush(); ms.Position = 0; //sheet.Dispose(); sheet = null; workbook = null; //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet getms = ms; } #endregion using (MemoryStream ms = getms) { using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write)) { byte[] data = ms.ToArray(); fs.Write(data, 0, data.Length); fs.Flush(); } } } #endregion #region 使用NPOI导入 /// <summary>读取excel /// 默认第一行为表头,导入第一个工作表 /// </summary> /// <param name="strFileName">excel文档路径</param> /// <returns></returns> public static DataTable Import(string strFileName) { DataTable dt = new DataTable(); HSSFWorkbook hssfworkbook; using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)) { hssfworkbook = new HSSFWorkbook(file); } ISheet sheet = hssfworkbook.GetSheetAt(0); System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); IRow headerRow = sheet.GetRow(0); int cellCount = headerRow.LastCellNum; for (int j = 0; j < cellCount; j++) { ICell cell = headerRow.GetCell(j); dt.Columns.Add(cell.ToString()); } for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) { IRow row = sheet.GetRow(i); DataRow dataRow = dt.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { if (row.GetCell(j) != null) dataRow[j] = row.GetCell(j).ToString(); } dt.Rows.Add(dataRow); } return dt; } /// <summary> /// 从Excel中获取数据到DataTable /// </summary> /// <param name="strFileName">Excel文件全路径(服务器路径)</param> /// <param name="SheetName">要获取数据的工作表名称</param> /// <param name="HeaderRowIndex">工作表标题行所在行号(从0开始)</param> /// <returns></returns> public static DataTable RenderDataTableFromExcel(string strFileName, string SheetName, int HeaderRowIndex) { using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = new HSSFWorkbook(file); ISheet sheet = workbook.GetSheet(SheetName); return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex); } } /// <summary> /// 从Excel中获取数据到DataTable /// </summary> /// <param name="strFileName">Excel文件全路径(服务器路径)</param> /// <param name="SheetIndex">要获取数据的工作表序号(从0开始)</param> /// <param name="HeaderRowIndex">工作表标题行所在行号(从0开始)</param> /// <returns></returns> public static DataTable RenderDataTableFromExcel(string strFileName, int SheetIndex, int HeaderRowIndex) { using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = new HSSFWorkbook(file); string SheetName = workbook.GetSheetName(SheetIndex); return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex); } } /// <summary> /// 从Excel中获取数据到DataTable /// </summary> /// <param name="ExcelFileStream">Excel文件流</param> /// <param name="SheetName">要获取数据的工作表名称</param> /// <param name="HeaderRowIndex">工作表标题行所在行号(从0开始)</param> /// <returns></returns> public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, string SheetName, int HeaderRowIndex) { IWorkbook workbook = new HSSFWorkbook(ExcelFileStream); ExcelFileStream.Close(); return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex); } /// <summary> /// 从Excel中获取数据到DataTable /// </summary> /// <param name="ExcelFileStream">Excel文件流</param> /// <param name="SheetIndex">要获取数据的工作表序号(从0开始)</param> /// <param name="HeaderRowIndex">工作表标题行所在行号(从0开始)</param> /// <returns></returns> public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex) { IWorkbook workbook = new HSSFWorkbook(ExcelFileStream); ExcelFileStream.Close(); string SheetName = workbook.GetSheetName(SheetIndex); return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex); } /// <summary> /// 从Excel中获取数据到DataTable /// </summary> /// <param name="workbook">要处理的工作薄</param> /// <param name="SheetName">要获取数据的工作表名称</param> /// <param name="HeaderRowIndex">工作表标题行所在行号(从0开始)</param> /// <returns></returns> public static DataTable RenderDataTableFromExcel(IWorkbook workbook, string SheetName, int HeaderRowIndex) { ISheet sheet = workbook.GetSheet(SheetName); DataTable table = new DataTable(); try { IRow headerRow = sheet.GetRow(HeaderRowIndex); int cellCount = headerRow.LastCellNum; for (int i = headerRow.FirstCellNum; i < cellCount; i++) { DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue); table.Columns.Add(column); } int rowCount = sheet.LastRowNum; #region 循环各行各列,写入数据到DataTable for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) { IRow row = sheet.GetRow(i); DataRow dataRow = table.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { ICell cell = row.GetCell(j); if (cell == null) { dataRow[j] = null; } else { //dataRow[j] = cell.ToString(); switch (cell.CellType) { case CellType.Blank: dataRow[j] = null; break; case CellType.Boolean: dataRow[j] = cell.BooleanCellValue; break; case CellType.Numeric: dataRow[j] = cell.ToString(); break; case CellType.String: dataRow[j] = cell.StringCellValue; break; case CellType.Error: dataRow[j] = cell.ErrorCellValue; break; case CellType.Formula: default: dataRow[j] = "=" + cell.CellFormula; break; } } } table.Rows.Add(dataRow); //dataRow[j] = row.GetCell(j).ToString(); } #endregion } catch (System.Exception ex) { table.Clear(); table.Columns.Clear(); table.Columns.Add("出错了"); DataRow dr = table.NewRow(); dr[0] = ex.Message; table.Rows.Add(dr); return table; } finally { //sheet.Dispose(); workbook = null; sheet = null; } #region 清除最后的空行 for (int i = table.Rows.Count - 1; i > 0; i--) { bool isnull = true; for (int j = 0; j < table.Columns.Count; j++) { if (table.Rows[i][j] != null) { if (table.Rows[i][j].ToString() != "") { isnull = false; break; } } } if (isnull) { table.Rows[i].Delete(); } } #endregion return table; } #endregion