如何将多个工作表合并为具有样式的单个工作表

时间:2018-11-06 13:29:26

标签: c# excel

我知道,关于此主题有很多问题,但是我没有找到可用的解决方案。

我有多个excel文件,每个文件都有一个工作表,我想将工作表合并到一个具有所有样式(列宽,单元格边框,填充颜色,字体大小等)的工作簿和工作表中。

我怎么做,我尝试了Spire.Xls,但是样式没有复制。

private void CombineFiles(List<string> files,string outputPath)
        {

            Spire.Xls.Workbook resultworkbook = new Spire.Xls.Workbook();
            Spire.Xls.Worksheet resultworksheet = resultworkbook.Worksheets.Add("worksheet");

            foreach (var file in files)
            {
                Spire.Xls.Workbook workbook = new Spire.Xls.Workbook();
                workbook.LoadFromFile(file);

                Spire.Xls.Worksheet sheet = workbook.Worksheets[0];
                System.Data.DataTable dataTable = sheet.ExportDataTable();
                resultworksheet.InsertDataTable(dataTable, false, sheet.LastRow + 1, 1);
            }

            resultworkbook.SaveToFile(outputPath);
            System.Diagnostics.Process.Start(outputPath);
        }

1 个答案:

答案 0 :(得分:1)

如果要将多个工作表合并到一个工作表中时要复制样式,则应使用 CellRange.Copy()/ Worksheet.Copy()而不是Worksheet.InsertDataTable()。另外请注意,不可能复制列宽,如果所有列宽都相同,则可以获取列宽,然后将其设置为复制的列。

尝试以下代码:

    static void Main(string[] args)
    {
        string outputPath = "‪output.xlsx";
        List<string> files = new List<string>();
        files.Add(@"File1.xlsx");
        files.Add(@"File2.xlsx");
        CombineFiles(files, outputPath);
    }
    private static void CombineFiles(List<string> files, string outputPath)
    {
        Spire.Xls.Workbook resultworkbook = new Spire.Xls.Workbook();
        resultworkbook.Worksheets.Clear();
        Spire.Xls.Worksheet resultworksheet = resultworkbook.Worksheets.Add("worksheet");

        Spire.Xls.Workbook workbook = new Spire.Xls.Workbook();
        for (int i = 0; i < files.Count; i++)
        {
            workbook.LoadFromFile(files[i]);
            Worksheet sheet = workbook.Worksheets[0];
            if (i == 0)
            {
                sheet.AllocatedRange.Copy(resultworksheet.Range[1, 1], true, true);

            }
            else
            {
                sheet.AllocatedRange.Copy(resultworksheet.Range[resultworksheet.LastRow + 1, 1], true, true);
            }
        }


        resultworkbook.SaveToFile(outputPath, ExcelVersion.Version2013);
        System.Diagnostics.Process.Start(outputPath);
    }