Execl文件中的表格名一致(源文件和目标文件中的表格名)

比如源文件和目标文件的表格名都是sheet1,怎么在保存的目标文件中还保持表格名为sheet1,或者说用哪个方法可以实现?

@aspose1111
你愿意详细描述一下你的需求吗? 如果是工作表(Worksheet)的名字, 直接打开并重新保存后是不会改变的。
如果是两个文件合并,原文件和目标文件都有相同名字(如 “Sheet1”)的工作表,那么合并后的文件会存在名字为"Sheet1 (2)"的工作表。这个名字改变规则是遵循Excel规范的。
你也可以通过Worksheet.Name属性改变工作表的名字。

我是需要将源文件内容复制到目标文件,使用的Add方法去复制表格名字,但是源文件和目标文件中的表格名字一致,就无法使用Add方法复制,想问下有其他的方法代替吗?直接将目标文件中的表格名覆盖

Aspose.Cells.Worksheet worksheetDest = workbookDest.Worksheets.Add(sheetName);
使用的这句话

@aspose1111
一个Excel文件是不允许存在两个相同名字的工作表。如果你原文件中相同名字的工作表不需要了,你可以调用Workbook.Worksheets.RemoveAt(string name)先删除后再进行其他操作。

@aspose1111
如果目标文件中存在同名的表格, 你期望的处理模式是什么?
删除已有的表格?
直接覆盖已有的表格?

我需要还是这个重复的名字不变,然后将源文件的表格内容复制过来

@aspose1111
你可以有两种方式来达到目标。

  1. 将原worksheet的数据拷贝到目标worksheet的后面,你可以通过范围拷贝实现。请参考以下文档。

2. 直接拷贝worksheet,但是目标worksheet的数据会被覆盖。

样例代码如下:

Workbook dest = new Workbook(filePath + "a.xlsx");
Workbook source = new Workbook(filePath + "b.xlsx");
string sheetName = "Sheet1";
Worksheet destSheet = dest.Worksheets[sheetName];
Worksheet sourceSheet = source.Worksheets[sheetName];

//第一种方式:将内容拷贝到原有内容后面
Range soureRange = sourceSheet.Cells.MaxDisplayRange;
Range destRange = destSheet.Cells.MaxDisplayRange;
Range copyRange = destSheet.Cells.CreateRange(destRange.FirstRow + destRange.RowCount + 1, 0,
    soureRange.RowCount, soureRange.ColumnCount);
copyRange.Copy(soureRange);
dest.Save(filePath + @"a_out.xlsx");

//第二种方式:直接拷贝worksheet, 原内容会被覆盖
destSheet.Copy(sourceSheet);

dest.Save(filePath + @"a_out2.xlsx");

运行结果请查看附件 (27.8 KB)。
希望这些能对你有所帮助。

ok,我看看,感谢感谢!!!!!

@aspose1111
不客气。如果你有任何疑问,请随时联系我们。

还有个问题,为什么只有第一个表格是Sheet1,它就会报这个错误;
Aspose.Cells.CellsException:“The same worksheet name already exists”
后面的表格是Sheet2,名字也是一样的,就可以执行

@aspose1111,

您能否分享您的示例(可运行)代码并附上您的 Excel 模板文件来显示问题,我们会尽快检查。

附言。 请先压缩 Excel 文件,然后再附加到此处。

源execl文件如下:
execl文件.zip (11.4 KB)

运行的源代码如下:
代码.zip (1.3 KB)

@aspose1111,

请注意,当您使用以下行实例化新工作簿时:

Aspose.Cells.Workbook workbookDest = new Aspose.Cells.Workbook();

系统会自动添加默认工作表(以“Sheet1”命名),因为如果没有至少一个/单个工作表,新工作簿就无法存在。

不管怎样,我用最新版本测试了你的确切代码,它工作得非常好。 我没有得到任何例外。 请参阅附件中的输出 Excel 文件以供参考。
dst.zip (8.4 KB)

用下面的代码试下呢?
using Aspose.Cells;
class ExcelCopy {
static void Main(string[] args) {
Aspose.Cells.License license = new Aspose.Cells.License();
license.SetLicense(@“D:\无害共享传输.NET\Aspose.Total.lic”);

    Aspose.Cells.Workbook workbookSrc = new Aspose.Cells.Workbook("D:\\无害共享传输\\C#_project\\execl\\白屏炸弹.xls");
    Aspose.Cells.Workbook workbookDest = new Aspose.Cells.Workbook();
    
    // 遍历源文件的所有表格
    for (int i = 0; i < workbookSrc.Worksheets.Count; i++)
    {           
        Aspose.Cells.Worksheet worksheetSrc = workbookSrc.Worksheets[i];            
        Aspose.Cells.Worksheet worksheetDest = workbookDest.Worksheets.Add(worksheetSrc.Name);
        worksheetDest.Copy(worksheetSrc, new Aspose.Cells.CopyOptions());
        style_Copy(worksheetSrc, worksheetDest);                               
    }       
    // 移除第一个工作表
    if (workbookDest.Worksheets.Count > 0)
        workbookDest.Worksheets.RemoveAt(0);       
    workbookDest.Save("D:\\无害共享传输\\C#_project\\execl\\dst.xls");       
    Console.WriteLine("execl文件处理结束!");
}
private static void style_Copy(Aspose.Cells.Worksheet src_Sheet,Aspose.Cells.Worksheet dst_Sheet)
{       
    Aspose.Cells.Cells cellsSrc = src_Sheet.Cells;
    Aspose.Cells.Cells cellsDest = dst_Sheet.Cells;
    // 获取源文件和目标文件中使用的最大行号和列号
    int maxRow = cellsSrc.MaxRow;
    int maxColumn = cellsSrc.MaxColumn;
    // 遍历源文件的单元格,复制给目标文件对应的单元格
    for (int row = 0; row <= maxRow; row++)
    {
        for (int col = 0; col <= maxColumn; col++)
        {
            Aspose.Cells.Cell cellSrc = cellsSrc[row, col];
            Aspose.Cells.Cell cellDest = cellsDest[row, col];
            // 复制源单元格的数据到目标单元格
            Style styleSrc = cellSrc.GetStyle();
            Style styleDst = cellDest.GetStyle();

            Font fontSrc = styleSrc.Font;
            Font fontDest = styleDst.Font;
            fontDest.Name = fontSrc.Name;
            fontDest.Size = fontSrc.Size;
            fontDest.IsBold = fontSrc.IsBold;
            fontDest.IsItalic = fontSrc.IsItalic;
            fontSrc.Underline = fontSrc.Underline;

            int colorSrc = styleSrc.BackgroundArgbColor;
            styleDst.BackgroundArgbColor = colorSrc;

            cellDest.SetStyle(styleDst);
            cellDest.PutValue(cellSrc.Value);
        }
    }
}

}

@amjad.sahi 用我刚刚发的代码试下,就会有报错

@aspose1111
请把
// 移除第一个工作表
if (workbookDest.Worksheets.Count > 0)
workbookDest.Worksheets.RemoveAt(0);
移到for 循环前面

@aspose1111
你也可以在添加前先检查一下是否存在同名的表格

Workbook wb = new Workbook(dir + "test (1).xlsx");
            Workbook workbookSrc = new Aspose.Cells.Workbook("D:\\无害共享传输\\C#_project\\execl\\白屏炸弹.xls");
            Aspose.Cells.Workbook workbookDest = new Aspose.Cells.Workbook();

            // 遍历源文件的所有表格
            for (int i = 0; i < workbookSrc.Worksheets.Count; i++)
            {
                Aspose.Cells.Worksheet worksheetSrc = workbookSrc.Worksheets[i];
                Aspose.Cells.Worksheet worksheetDest = workbookDest.Worksheets[worksheetSrc.Name];
                if(workbookDest != null)
                {
                    //覆盖当前,或者删除后重写添加
                }
                else
                {
                    worksheetDest = workbookDest.Worksheets.Add(worksheetSrc.Name);
                }

                worksheetDest.Copy(worksheetSrc, new Aspose.Cells.CopyOptions());
               // style_Copy(worksheetSrc, worksheetDest);
            }

这种方式可以解决,非常感谢!!!!

@aspose1111,

很高兴知道您的问题现在已得到解决。 如果您还有其他疑问或问题,请随时给我们回信,我们将很乐意尽快为您提供帮助。