Agarwal1984 Ответов: 0

Как экспортировать datatable в excel с помощью шаблона excel и OLE DB без какой-либо третьей библиотеки в C# web API


Привет,

Я хочу, чтобы мне нужно было экспортировать excel с помощью c# web api, мой код экспортируется один раз только тогда, когда я создал вручную один файл шаблона excel в папке, но мой цикл for не экспортируется во второй раз.

Как мы можем решить этот вопрос? Я хочу использовать существующий файл excel, Как только шаблон.

Мы не можем использовать стороннюю библиотеку.

Я хочу создать zip-архив всех файлов извлечения.

Пожалуйста, помогите мне.

заранее спасибо.

Анкит Агарвал
инженер-программист

Что я уже пробовал:

Это экспорт в Excel кода:- (я пробовал поток памяти, но не знаю, как обращаться с потоком памяти).

public void ExportToExcel(DataTable table, string tempfileName)
        {
            HttpContext context = HttpContext.Current;
            context.Response.Clear();
            
            string query;
            OleDbCommand cmd;
            
            try
            {
                string cnStr = GetConnectionString(tempfileName, Types.Excel_2007_XML_xlsx, true, true);

                using (OleDbConnection cnn = new OleDbConnection(cnStr))
                { 
                    cnn.Open();

                //Drop the existing sheet(first Sheet)
                query = "DROP TABLE [Sheet1$]";
                cmd = new OleDbCommand(query, cnn);
                cmd.ExecuteNonQuery();

                //Create new sheet with our requirements
                query = "CREATE TABLE [Sheet1$] (";
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    query += table.Columns[i].ColumnName;
                    if (i + 1 == table.Columns.Count)
                        if (table.Columns[i].DataType == System.Type.GetType("System.Int32"))
                            query += " INT)";
                        else
                            query += " VARCHAR(255))";
                    else
                        if (table.Columns[i].DataType == System.Type.GetType("System.Int32"))
                        query += " INT,";
                    else
                        query += " VARCHAR(255),";
                }
                cmd = new OleDbCommand(query, cnn);
                cmd.ExecuteNonQuery();

                    //Insert Data
                    foreach (DataRow row in table.Rows)
                    {
                        string values = "(";
                        for (int i = 0; i < table.Columns.Count; i++)
                        {
                            if (i + 1 == table.Columns.Count)
                            {
                                if (table.Columns[i].DataType == System.Type.GetType("System.Int32"))
                                    values += String.IsNullOrEmpty(row[i].ToString()) ? "0)" : row[i] + ")";
                                else
                                    values += "'" + System.Security.SecurityElement.Escape(row[i].ToString()) + "')";
                            }
                            else
                            {
                                if (table.Columns[i].DataType == System.Type.GetType("System.Int32"))
                                    values += String.IsNullOrEmpty(row[i].ToString()) ? "0," : row[i] + ",";
                                else
                                    values += "'" + System.Security.SecurityElement.Escape(row[i].ToString()) + "',";
                            }
                        }
                        query = String.Format("Insert into [Sheet1$] VALUES {0}", values);
                        cmd = new OleDbCommand(query, cnn);
                       // cnn.Open();
                        cmd.ExecuteNonQuery();
                        //cnn.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                context.Response.Write(ex.Message);
                return;
            }
            finally
            {
                //cmd = null;
                //if (cnn != null)
                //cnn.Close();
            }

            context.Response.ContentType = "application/ms-excel";
            context.Response.AppendHeader("Content-Disposition", "attachment;filename="+tempfileName);
            context.Response.WriteFile(tempfileName);
            //MemoryStream ms = new MemoryStream();
            //ms.Flush();
            //context.Response.BinaryWrite(ms.ToArray());

            //ms.WriteTo(context.Response.OutputStream);
        }


Способ строка подключения :-

private static string GetConnectionString(string fileName, string Type, bool isHeaderExists, bool TreatIntermixedAsText)
        {
            string cnnStr;
            string provider;

            if (Type == "Excel 5.0" || Type == "Excel 8.0")
                provider = "Microsoft.Jet.OLEDB.4.0";
            else
                provider = "Microsoft.ACE.OLEDB.12.0";

            cnnStr = "Provider=" + provider +
                        ";Data Source=" + fileName +
                        ";Extended Properties=\"" + Type +
                                               ";HDR=" + (isHeaderExists ? "Yes;\"" : "No;\"");

            return cnnStr;
        }


Основная функция:- (ABC и XYZ-это мои имена таблиц, и я создал одну хранимую процедуру для запуска обеих таблиц)

[HttpGet]
        public IHttpActionResult GetExtracts(DateTime StartDate, DateTime EndDate)
        {
            //DateTime StartDate = new DateTime();
            //DateTime EndDate = new DateTime();
            
            string ExtractNameList = "ABC" + "," + "XYZ";
            List<string> ExtractNames = ExtractNameList.Split(',').ToList<string>();
            foreach (var ExtractName in ExtractNames)
            {
                string strQuery = "Exec SpExtracts @StartDate,@EndDate,@ExtractName";
                SqlCommand cmd = new SqlCommand(strQuery);
                cmd.Parameters.AddWithValue("@StartDate", StartDate);
                cmd.Parameters.AddWithValue("@EndDate", EndDate);
                cmd.Parameters.AddWithValue("@ExtractName", string.IsNullOrEmpty(ExtractName) ? (object)System.DBNull.Value : (object)ExtractName);
                DataTable dt = GetData(cmd);
                newfileName= "S15_" + ExtractName + "_" + StartDate + "_" + EndDate + ".xlsx";
                newfileName = newfileName.Replace('/', '-');
                newfileName = newfileName.Replace(" ", "");
                newfileName = newfileName.Replace(":", "-");
                newfile = @"C:\tempFolder\Extracts\" + newfileName;
               
                string fileName = @"C:\tempFolder\Extracts\ExportTemplate.xlsx";
                ExportToExcel(dt, fileName);
                File.Copy(fileName, newfile,true);
                path = @"C:\tempFolder\Extracts\";

            }

            //String[] allfiles = System.IO.Directory.GetFiles(path, "*.xlsx*", System.IO.SearchOption.AllDirectories);
            //var result = new List<string>();
            //string[] extensions = { ".xlsx", ".xls" };
            //foreach (var files in Directory.EnumerateFiles(path, "*.xlsx*", SearchOption.AllDirectories).Where(s => extensions.Any(ext => ext == Path.GetExtension(s))))
            //    result.Add(files);
            //ZipHelper.ZipFiles(path, result, CompressionOption.Normal);
            return Ok(newfileName);

        }

Richard Deeming

Вы не можете использовать руководство - Рекомендации по автоматизации работы офиса на стороне сервера[^] В настоящее время корпорация Майкрософт не рекомендует и не поддерживает автоматизацию приложений Microsoft Office из любого автоматического, неинтерактивного клиентского приложения или компонента (включая ASP, ASP.NET, DCOM и NT Services), поскольку Office может демонстрировать нестабильное поведение и/или взаимоблокировку при запуске Office в этой среде.

И вы исключили возможность использования любой из этих превосходных бесплатных библиотек с открытым исходным кодом:
* EPPlus[^];
* ClosedXML[^];
* SDK OpenXML[^];

Так что у вас остается только один вариант: потратить следующие несколько месяцев (или лет) на изобретение колеса, написание кода для чтения и записи файлов Excel!

Agarwal1984

Я не могу использовать какую-либо стороннюю библиотеку, мы можем использовать только OLE DB

Karthik_Mahalingam

Совет:
использовать  Ответить  кнопка, чтобы отправить комментарии/запрос пользователю, чтобы пользователь получил уведомление и ответил на ваш текст.

0 Ответов