首页 > 数据库 >C#中将多个excel档案汇总为一个excel档,并批量汇入oracle数据库

C#中将多个excel档案汇总为一个excel档,并批量汇入oracle数据库

时间:2024-07-26 09:18:19浏览次数:14  
标签:string package C# excel Workbook oracle new DataTable

    private void bt_bach_oracle_Click(object sender, EventArgs e)
    {
        //將下載的excel匯總為一個excel
        string sourceFolder = @"D:\123"; // 源文件夹路径  
        string destinationFolder = @"D:\456"; // 目标文件夹路径  
        string destinationFile = "MergedFile.xlsx"; // 合并后的文件名  
        string sheetName = "123123"; // 工作表名  
        MergeExcelFiles(sourceFolder, destinationFolder, destinationFile);
        //讀取excel
        string filePath = @"D:\456\MergedFile.xlsx";
        //DataTable dataTable = new DataTable();

        // 加载Excel文件  
        using (var package = new ExcelPackage(new FileInfo(filePath)))
        {
            // 获取第一个工作表  
            //ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
            // 遍历所有工作表  
            foreach (var worksheet in package.Workbook.Worksheets)
            {
                //dataTable = null;
                DataTable dataTable = new DataTable();
                // 遍历工作表的列以创建DataTable的列  
                int colCount = worksheet.Dimension.End.Column;
                for (int col = 1; col <= colCount; col++)
                {
                    dataTable.Columns.Add(worksheet.Cells[1, col].Value.ToString()); // 假设第一行是标题行  
                }
                dataTable.Columns.Add("create_date", typeof(DateTime));//add一列,Create_date
                // 遍历工作表的行以填充DataTable的行  
                int rowCount = worksheet.Dimension.End.Row;
                for (int row = 2; row <= rowCount; row++) // 从第二行开始读取数据,假设第一行是标题行  
                {
                    DataRow newRow = dataTable.NewRow();
                    for (int col = 1; col <= colCount; col++)
                    {
                        newRow[col - 1] = worksheet.Cells[row, col].Value; // EPPlus中的索引是从1开始的,而DataTable中的索引是从0开始的  
                    }
                    newRow[colCount] = DateTime.Now;//add一列,Create_date
                    dataTable.Rows.Add(newRow);
                }
                //dataGridView1.DataSource = dataTable;
                //批量添加数据至数据库(**datatable结构要与数据库表结构一致**)
                DBHelp.BulkCopyDataToOracle(DBHelp.ConnMES, "as160_pnl_pcs_test", dataTable);

            }


        }
        //dataGridView1.DataSource = dataTable;
        //批量insert數據庫
        //DBHelp.BulkCopyDataToOracle(DBHelp.connect, "tabel_test", dataTable);
        MessageBox.Show("excel數據批量上傳成功!!!");
    }

    // 多個excel整合成一個excel多個sheet

    public static void MergeExcelFiles(string sourceFolderPath, string destinationFolderPath, string destinationFileName)
    {
        // 确保源文件夹存在  
        if (!Directory.Exists(sourceFolderPath))
        {
            throw new DirectoryNotFoundException("Source folder not found.");
        }

        // 确保目标文件夹存在,如果不存在则创建它  
        if (!Directory.Exists(destinationFolderPath))
        {
            Directory.CreateDirectory(destinationFolderPath);
        }

        // 获取源文件夹下所有的Excel文件  
        string[] excelFiles = Directory.GetFiles(sourceFolderPath, "*.xlsx", SearchOption.TopDirectoryOnly);

        // 如果没有找到任何Excel文件,则退出  
        if (excelFiles.Length == 0)
        {
            Console.WriteLine("No Excel files found in the source folder.");
            return;
        }

        // 创建一个新的ExcelPackage实例来保存合并后的数据  
        using (ExcelPackage package = new ExcelPackage())
        {
            // 遍历所有的Excel文件  
            foreach (string excelFile in excelFiles)
            {
                // 加载当前Excel文件  
                using (ExcelPackage sourcePackage = new ExcelPackage(new FileInfo(excelFile)))
                {
                    // 遍历当前Excel文件中的所有工作表  
                    foreach (ExcelWorksheet worksheet in sourcePackage.Workbook.Worksheets)
                    {
                        // 检查工作表名称是否已存在  
                        string proposedName = worksheet.Name;
                        int i = 1;
                        while (package.Workbook.Worksheets.Any(ws => ws.Name == proposedName))
                        {
                            // 如果存在,添加一个唯一标识符(例如序号)  
                            proposedName = $"{worksheet.Name}_{i++}";
                        }
                        // 添加或复制工作表到新的ExcelPackage(注意工作表名称的唯一性)  
                        //ExcelWorksheet newWorksheet = package.Workbook.Worksheets.Add(worksheet.Name + "_" + Path.GetFileNameWithoutExtension(excelFile));
                        //ExcelWorksheet newWorksheet = package.Workbook.Worksheets.Add(Path.GetFileNameWithoutExtension(excelFile));//文件名命名Sheet名
                        ExcelWorksheet newWorksheet = package.Workbook.Worksheets.Add(proposedName);
                        // 如果需要复制数据,可以使用以下逻辑(这里只是示例,可能需要根据实际情况调整)  
                        for (int row = 1; row <= worksheet.Dimension.End.Row; row++)
                        {
                            for (int col = 1; col <= worksheet.Dimension.End.Column; col++)
                            {
                                newWorksheet.Cells[row, col].Value = worksheet.Cells[row, col].Value;
                            }
                        }

                        // 这里只是简单地将工作表的结构复制到新工作表(不包含数据)  
                        // 如果你需要复制数据,请取消注释上面的循环  

                        // 如果你需要复制样式、格式等,你可能需要编写额外的逻辑来处理这些  
                    }
                }
            }

            // 保存合并后的Excel文件到目标文件夹  
            FileInfo newFile = new FileInfo(Path.Combine(destinationFolderPath, destinationFileName));
            package.SaveAs(newFile);
        }

        Console.WriteLine("Excel files have been merged successfully.");
    }

//数据库连接类class DBHelp
class DBHelp
{
public static string connect = "Host=你的IP;Port=端口;User ID=用户名;Password=密码;SID=数据库名";
//批量insert
public static void BulkCopyDataToOracle( string connectionString, string destinationTableName, DataTable dataTable)
{
using (OracleConnection connection = new OracleConnection(connectionString))
{
connection.Open();

            using (OracleBulkCopy bulkCopy = new OracleBulkCopy(connection))
            {
                // 设置目标数据库表名  
                bulkCopy.DestinationTableName = destinationTableName;
                // 將DataTable數據写入到目标表  
                bulkCopy.WriteToServer(dataTable);

            }
        }
    }

}

标签:string,package,C#,excel,Workbook,oracle,new,DataTable
From: https://www.cnblogs.com/xynmw/p/18324592

相关文章

  • C++ 虚基类注意事项
    C++中的虚基类(VirtualBaseClass)是一个重要的概念,主要用于解决多重继承中的菱形继承问题,即当一个派生类通过多条路径继承同一个基类时,基类在派生类中会有多个副本,导致资源浪费和不必要的复杂性。以下是C++虚基类的一些详细注意事项:1.虚基类的定义与声明定义方式:虚基类并不......
  • SpringBoot中集成screw(螺丝钉)实现数据库表结构文档生成
    场景经常会有编写数据库表结构文档的时间付出,那能否通过简单配置实现自动生成。screwscrew(螺丝钉)英:[skruː]~简洁好用的数据库表结构文档生成工具。https://gitee.com/leshalv/screw特点简洁、轻量、设计良好多数据库支持多种格式文档灵活扩展支持自定义模板数......
  • JAVA编译和运行的CMD命令
    JAVA编译和运行的CMD命令编译JAVA程序编译Java程序是将源代码文件(.java)转换为字节码文件(.class)的过程。在CMD中,我们可以使用javac命令来进行编译。命令格式:javac[选项]文件名.java运行JAVA程序编译完成后,你可以使用java命令来运行生成的字节码文件。命令格式:java[选项]......
  • c语言基础学习
    1.求1—1000的完数#include<stdio.h>#include<string.h>intmain(intargc,constchar*argv[]){ for(inti=1;i<1000;i++)//被模数 { intsum=0; for(intj=1;j<i;j++)//模数 { if(i%j==0)//求因子 { sum+=j;//因子和 } } if(s......
  • C语言:字符串函数族strlen,strcmp,C语言实现,
    1.字符串的复制:#include<stdio.h>#include<string.h>intmain(intargc,constchar*argv[]){ chararr[20]={0}; charbrr[20]={0}; intlen; inti; printf("请输入目标字符串arr:\n"); gets(arr); printf("请输入源字符串:\n"); gets(brr......
  • 鸿蒙Accessibility Kit无障碍服务开发指南(一)
    鸿蒙AccessibilityKit无障碍服务开发指南(一)文章目录鸿蒙AccessibilityKit无障碍服务开发指南(一)前言一、无障碍框架原理二、使用步骤1.继承AccessibilityExtensionAbility2.配置无障碍服务3.开启无障碍服务4.管理无障碍服务上下文前言无障碍模式是指任何人在任......
  • IEEE-Trans系列:TIV“倒下”,这本1区Top势头正猛,CCF-B类,国人友好,年发文1500!
    本周投稿推荐SCI&EI•1区计算机类,3.5-4.0(1个月录用)•CCF推荐,1区-Top(3天初审)EI•各领域沾边均可(2天录用)知网(CNKI)、谷歌学术•7天录用-检索(百发百中,包检索)SSCI• 1区,2.0-3.0(1个月录用)工程技术类2024年7月23日,著名顶级期刊IEEETransactionsonIntelligentVehi......
  • CSS样式--续写
    哥们上课听到啥写啥,不做无意义的笔记。---驴言一刻今天写常见的一些样式规划,例如字体的,页面的,浮动的这些。(都是css样式,不是标签)字体样式:这个是在页面编写中会经常用到的一类样式。例如字体的加粗、大小、变细、颜色变化、斜体、字体类型等等。字体加粗/变细:font-weight在c......
  • 如何安装mysqlclient 1.4.6? (Python 3.6)MacO?
    我安装pipinstallmysqlclient==1.4.6--no-cache-dir但是出现错误:ld:library'ssl'notfoundclang:error:linkercommandfailedwithexitcode1(use-vtoseeinvocation)error:command'clang'failedwithexitstatus......
  • Numpythonic 方式从所需的时间步长和窗口大小构造窗口向量
    给定参数timestep=2window_size=3我已经展平了大小为9的时间序列向量。内容是:arr=np.array([1,2,3,4,5,6,7,8,9])如何使用这些参数重塑/构造窗口时间序列?我希望输出具有形状unknown,window_size)所以,它的输出将是这样的矩阵:windowed_arr=np......