Подскажите, как написать такую же функцию на c#
Sub copyTable()
Dim colRange(), destColRange()
Dim Text As String
Dim i As Long, newI As Long, n As Long, j As Long
Dim maxLen As Long
colRange = Array(1, 2, 3, 4, 5, 6, 7) 'Columns where your data is'
destColRange = Array(10, 11, 12, 13, 14, 15, 16, 17) 'Columns where you want
'data be copied'
n = UBound(colRange) - LBound(colRange)-1
i = 2 'Initial row'
newI = i
maxLen = 500 'Maximum size allowed in one cell'
While Not (Cells(i, colRange(0)) Is Nothing) And (Cells(i, colRange(0)) <>
"")
Text = Cells(i, colRange(n))
Do
For j = 0 To n - 1
Cells(newI, destColRange(j)) = Cells(i, colRange(j))
Next j
Cells(newI, destColRange(j)) = Mid(Text, 1, maxLen)
Text = Mid(Text, maxLen + 1)
newI = newI + 1
Loop Until Len(Text) <= 0
i = i + 1
Wend
End Sub
(Поправил в коде некоторый вещи, то что мне нужно было) Вот примерно, что делает макрос.
Вот попробовал сделать так, но не получается.
static class Program
{
static void Main()
{
// тестовые данные
Excel.Application app = new Excel.Application() { Visible = true };
Excel.Workbook book = app.Workbooks.Add();
Excel.Worksheet sheet = book.Worksheets[1];
Excel.Range table = sheet.Range["a1:d4"];
table.Value = new object[,]
{
{ "h1", "h2", "h3", "h4" },
{ 11, 12, "abcdefgh", 14 },
{ 21, 22, "abcd", 24 },
{ 31, 32, "ab", 34 },
};
table.Copy(sheet.Range["f1"]);
table = sheet.Range["f1"].Resize[table.Rows.Count, table.Columns.Count];
// как-то получаем диапазон таблицы (после копирования или еще откуда-
то)
// и "вытягиваем" его по второму столбцу (нумерация с нуля)
// чтобы в нем было максимум по 3 символа
WrapRows(table, 2, 3);
}
static void WrapRows(Excel.Range table, int Column, int MaxLength)
{
object[,] oldValue = table.Value; // Получаем данные из Excel в виде
массива
object[,] newValue = oldValue
.EnumerateRows() // Перечисляем строки
.SelectMany(row => WrapRow(row, Column, MaxLength)) // каждую строку
рвем по столбцу
.ToArray() // собираем в jagged массив
.ToSolidArray(); // собираем в двумерный массив
// переносим новые данные на лист
table
.Cells[1, 1] // берем первую ячейку
// И растягиваем диапазон под размер новых данных
.Resize[newValue.GetLength(0), newValue.GetLength(1)]
.value = newValue;
}
// берет строку (в виде массива) и делит её на несколько строк разрезанных
по столбцу
static IEnumerable<object[]> WrapRow(object[] Row, int Column, int
MaxLength)
{
var text = Row[Column].ToString(); // исходная строка из ячейки
do
{
var m = Math.Min(text.Length, MaxLength);
var currentRow = Row.ToArray(); // копируем строку
currentRow[Column] = text.Substring(0, m); // вставляем часть текста
text = text.Substring(m); // удаляем вставленую часть текста
yield return currentRow;
}
while (text.Length > 0);
}
// Берет двумерный массив и пересичляет его строки как отдельные массивы
static IEnumerable<T[]> EnumerateRows<T>(this T[,] solid)
{
for (int i = 0; i < solid.GetLength(0); i++)
{
var row = new T[solid.GetLength(1)];
for (int j = 0; j < row.Length; j++)
row[j] = solid[solid.GetLowerBound(0) + i,
solid.GetLowerBound(1) + j];
yield return row;
}
}
// Преобразует рванный массив в двумерный
static T[,] ToSolidArray<T>(this T[][] jagged)
{
var solid = new T[jagged.Length, jagged[0].Length];
for (int i = 0; i < solid.GetLength(0); i++)
for (int j = 0; j < solid.GetLength(1); j++)
solid[i, j] = jagged[i][j];
return solid;
}
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости