I think you need to set a reference to the sheet you want to write data into before you start writing the cell contents
for (int i = 0; i < ds.Tables.Count; i++)
{
DataTable dt = ds.Tables[i];
Sheet_count += 1;
WorkSheet worksheet = (Worksheet) sheets.get_Item(Sheet_count);
int iCol = 0;
foreach (DataColumn c in dt.Columns)
{
iCol++;
worksheet.Cells[1, iCol] = c.ColumnName;
worksheet.Cells[1, iCol].Font.Bold = true;
}
}
So don't use the application variable to write the cell contents (which i think refers to the 'ActiveSheet'), but use your explicitly retrieved WorkSheet object to access the Cells. As mentioned, using a Range object is probably better
Towards the end of your code, you're not even using any of these variables, what is the point in them?
wsheets[i].Name = dt.TableName;
range[i] = wsheets[i].Cells;
xlCells[i] = wsheets[i].Cells;
Don't forget to clean up all your COM Interop