Для меня это работало со следующими аннотациями:
@Modifying
@Query("update JsonContactImport x set x.isImported = true where x.id in :ids")
@Transactional
void updateImported(@Param("ids") List<Long> ids);
Вы не можете объединить ряд ячеек (иначе Письма ), используя собственные функции рабочего листа, не зная области заранее. Поскольку ваша коллекция строк в группы имеет случайное число элементов, подход к циклу VBA представляется лучшим (если не единственным) способом решения проблемы. Цикл может делать определения так, что функция рабочего листа просто неспособна выполнить.
Нажмите Alt + F11 и, когда откроется редактор Visual Basic (aka VBE), немедленно используйте раскрывающиеся меню для вставки ► Модуль (Alt + I, M). Вставьте одно или оба из следующего в новую панель под названием «g1» Book1 - Module1 (Code) .
Чтобы объединить строки, ограниченные пробелом:
Sub concatenate_and_transpose_to_delim_string()
Dim rw As Long, lr As Long, pid As Long, str As String
Dim bPutInColumns As Boolean
With ActiveSheet
lr = .Cells(Rows.Count, 1).End(xlUp).row
.Cells(1, 4).Resize(1, 2) = Array("Id", "Letters")
pid = .Cells(2, 1).Value
For rw = 2 To lr
If IsEmpty(.Cells(rw, 1)) Then
str = str & Chr(32)
If pid <> .Cells(rw + 1, 1).Value Then
.Cells(Rows.Count, 4).End(xlUp).Offset(1, 0) = pid
.Cells(Rows.Count, 4).End(xlUp).Offset(0, 1) = str
End If
ElseIf pid <> .Cells(rw, 1).Value Then
pid = .Cells(rw, 1).Value
str = .Cells(rw, 2).Value
Else
str = str & .Cells(rw, 2).Value
End If
Next rw
.Cells(Rows.Count, 4).End(xlUp).Offset(1, 0) = pid
.Cells(Rows.Count, 4).End(xlUp).Offset(0, 1) = str
End With
End Sub
Чтобы разбить группы строк на столбцы:
Sub concatenate_and_transpose_into_columns()
Dim rw As Long, lr As Long, nr As Long, pid As Long, str As String
With ActiveSheet
lr = .Cells(Rows.Count, 1).End(xlUp).row
.Cells(1, 4).Resize(1, 2) = Array("Id", "Letters")
For rw = 2 To lr
If IsEmpty(.Cells(rw, 1)) Then
.Cells(nr, Columns.Count).End(xlToLeft).Offset(0, 1) = str
str = vbNullString
ElseIf pid <> .Cells(rw, 1).Value Then
pid = .Cells(rw, 1).Value
nr = .Cells(Rows.Count, 4).End(xlUp).Offset(1, 0).row
.Cells(nr, 4) = pid
str = .Cells(rw, 2).Value
Else
str = str & .Cells(rw, 2).Value
End If
Next rw
.Cells(nr, Columns.Count).End(xlToLeft).Offset(0, 1) = str
End With
End Sub
Нажмите Alt + Q, чтобы вернуться на рабочий лист. С вашими примерными данными на активном листе, начиная с Id
в A1, нажмите Alt + F8, чтобы открыть диалог «Макросы» и «Запустить макрос».
Результаты из concatenate_and_transpose_to_delim_string:
[/g2]
Результаты concatenate_and_transpose_into_columns:
[/g3]
Результаты будут записаны в ячейки, начинающиеся с D2. Вероятно, лучше, если раньше не было ничего важного, которое было бы перезаписано.
Добавление:
Я оригинал неправильно истолковал ваш запрос и разделил группы строк на отдельные столбцы. Я исправил это с помощью дополнительной процедуры, которая более точно соответствует вашему описанию требований, но сохранила оба варианта для других ссылок.
Для таких задач, как этот, Microsoft добавила «Get & amp; Transform» в Excel 2016. Чтобы использовать эту функциональность в более ранних версиях, вы должны использовать надстройку Power Query. M-код очень короткий:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
FillIdDown = Table.FillDown(Source,{"Id"}),
ReplaceNull = Table.ReplaceValue(FillIdDown,null," ",Replacer.ReplaceValue,{"Letter"}),
Transform = Table.Group(ReplaceNull, {"Id"}, {{"Count", each Text.Combine(_[Letter])}})
in
Transform
Ваши данные должны размещаться в «Таблице 1». https://www.dropbox.com/s/bnvchofmpvd048v/SO_AggregateCollateAndTransposeColsIntoRows.xlsx?dl=0