我有以下excel范围:
workSheet.Range[workSheet.Cells[12, 2], workSheet.Cells[5000, 2]]
我已将此excel范围转换为List并在列表上执行了一些数据操作。
object[,] cellValues = (object[,])inputRng.Value2;
List<string> lst = cellValues.Cast<object>().ToList().ConvertAll(x => Convert.ToString(x));
我想将列表分配回Excel范围。
答案 0 :(得分:3)
这里有一些适合您的起始代码,它可能会被完善。
你的主要问题&#34;是你从多维数组(object[,] cellValues = (object[,])excelRange.Value;
)到List<string>
的转换 - 如果你能以某种方式将它保存为多维数组,那么这将有助于你的设置&#34;代码 - 它取决于您的其他代码正在做什么。
当你想要&#34;设置&#34;您的更改回来了,我已经展示了两种方法:
遍历单元格(范围)并设置每个值
或提前提供多维数值数组并获取一次性使用它们的范围
下面:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
namespace WindowsFormsApplication10
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// Create starting spreadsheet
Microsoft.Office.Interop.Excel.Application excelApp;
Microsoft.Office.Interop.Excel.Workbook excelWorkbook;
Microsoft.Office.Interop.Excel.Worksheet excelWorksheet;
excelApp = new Microsoft.Office.Interop.Excel.Application();
excelApp.Visible = true;
excelWorkbook = excelApp.Workbooks.Add();
excelWorksheet = excelWorkbook.Sheets.Add();
excelWorksheet.Activate();
Microsoft.Office.Interop.Excel.Range excelRange = excelWorksheet.Range[excelWorksheet.Cells[12, 2], excelWorksheet.Cells[5000, 2]];
// Turn off updating to make it faster
excelApp.ScreenUpdating = false;
// Set some initial data
int i = 1;
foreach (Microsoft.Office.Interop.Excel.Range cell in excelRange.Cells)
{
cell.Value = i;
i++;
}
// Get the data from those cells as a list of strings
object[,] cellValues = (object[,])excelRange.Value;
List<string> lst = cellValues.Cast<object>().ToList().ConvertAll(x => Convert.ToString(x));
// Modify the strings in some way
for (int l = 0; l < lst.Count; l++)
{
lst[l] = lst[l] + "modified";
}
// Here are some different ways set the "cells" back
// Set the cells back with the changes
//------------------------------------
// Option 1: using a multidimensional array
/*
object[,] cellValuesToWrite = new string[excelRange.Rows.Count, excelRange.Columns.Count];
int z = 0;
foreach (string str in lst)
{
cellValuesToWrite[z,0] = lst[z];
z++;
}
excelRange.Value2 = cellValuesToWrite;
*/
// Option 2: iterating the range of cells and "setting" the value
/*
int z = 0;
foreach (Microsoft.Office.Interop.Excel.Range cell in excelRange.Cells)
{
cell.Value = lst[z];
z++;
}
excelRange.Value2 = lst;
*/
// Turn updating back on
excelApp.ScreenUpdating = true;
}
}
}